Github user arpadboda commented on a diff in the pull request:

    https://github.com/apache/nifi-minifi-cpp/pull/459#discussion_r240994771
  
    --- Diff: nanofi/examples/CMakeLists.txt ---
    @@ -50,11 +50,11 @@ if (WIN32)
         set(LINK_FLAGS "/WHOLEARCHIVE")
         set(LINK_END_FLAGS "")
     elseif (APPLE)
    -    set(LINK_FLAGS "-Wl,-all_load")
    +    set(LINK_FLAGS "")
    --- End diff --
    
    Good spot, the change made it better and worse as well.
    
    I debugged cmake and found that the problem is caused by "unifying" 
beginning and ending argument of whole-archive. This means that in case 
multiple makefiles specifies them, only the first specification takes effect. 
    As other platforms don't need closing argument, the issue is 
Linux-specific. 
    
    This is the original linker command generated:
    ```
    /usr/bin/c++   -std=c++11 -DOPENSSL_SUPPORT -std=c++11 -std=c++11 -O3 
-DNDEBUG  -rdynamic CMakeFiles/generate_flow.dir/generate_flow.c.o  -o 
generate_flow ../libnanofi.a -lpthread -Wl,--whole-archive 
../../extensions/http-curl/libminifi-http-curl.a -Wl,--no-whole-archive 
../../libminifi/libminifi.a ../../libminifi/libcore-minifi.a 
../../thirdparty/yaml-cpp-yaml-cpp-20171024/libyaml-cpp.a 
../../extensions/expression-language/libminifi-expression-language-extensions.a 
../../thirdparty/uuid/libuuid.a 
../../extensions/expression-language/date/libtz.a -lcurl -ldl -lssl -lcrypto 
../../extensions/civetweb/libminifi-civet-extensions.a 
../../thirdparty/civetweb-1.10/src/libcivetweb.a -lpthread 
../../thirdparty/civetweb-1.10/src/libcivetweb-cpp.a -l
    ```
    Which is wrong as it only specifies whole-archive for 
libminifi-http-curl.a, but the processors are in liminifi.a, so they are 
stripped out.
    
    The first version of my change made it to the opposite:
    ```
    /usr/bin/c++   -std=c++11 -DOPENSSL_SUPPORT -std=c++11 -std=c++11 -O3 
-DNDEBUG  -rdynamic CMakeFiles/generate_flow.dir/generate_flow.c.o  -o 
generate_flow ../libnanofi.a -lpthread 
../../extensions/http-curl/libminifi-http-curl.a -Wl,--whole-archive 
../../libminifi/libminifi.a ../../libminifi/libcore-minifi.a 
../../thirdparty/yaml-cpp-yaml-cpp-20171024/libyaml-cpp.a 
../../extensions/expression-language/libminifi-expression-language-extensions.a 
../../thirdparty/uuid/libuuid.a 
../../extensions/expression-language/date/libtz.a -Wl,--no-whole-archive -lcurl 
-ldl -lssl -lcrypto ../../extensions/civetweb/libminifi-civet-extensions.a 
../../thirdparty/civetweb-1.10/src/libcivetweb.a -lpthread 
../../thirdparty/civetweb-1.10/src/libcivetweb-cpp.a -lz 
    ```
    In this case libminifi was fine, but libminifi-http-curl is left without 
whole-archive flag. 
    
    With the current change:
    ```
    /usr/bin/c++   -std=c++11 -DOPENSSL_SUPPORT -std=c++11 -std=c++11 -O3 
-DNDEBUG  -rdynamic CMakeFiles/generate_flow.dir/generate_flow.c.o  -o 
generate_flow ../libnanofi.a -lpthread -Wl,--whole-archive 
../../extensions/http-curl/libminifi-http-curl.a ../../libminifi/libminifi.a 
../../libminifi/libcore-minifi.a 
../../thirdparty/yaml-cpp-yaml-cpp-20171024/libyaml-cpp.a 
../../extensions/expression-language/libminifi-expression-language-extensions.a 
../../thirdparty/uuid/libuuid.a 
../../extensions/expression-language/date/libtz.a -Wl,--no-whole-archive -lcurl 
-ldl -lssl -lcrypto ../../extensions/civetweb/libminifi-civet-extensions.a 
../../thirdparty/civetweb-1.10/src/libcivetweb.a -lpthread 
../../thirdparty/civetweb-1.10/src/libcivetweb-cpp.a -lz 
    ```
    This looks good, verified curl symbols as well. 



---

Reply via email to