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.
---