【发布时间】:2020-12-03 10:43:19
【问题描述】:
我为Linux动态库构建了C++应用程序,每个动态库也依赖并链接到其他动态库,构建所有动态库都很好,但是当我构建一个可执行应用程序来链接所有应用程序动态库时,它失败了一个库链接另一个库:
g++ -pthread -Wl,-z,relro -Wl,--copy-dt-needed-entries -Wl,-z,relro -lc -o wifi_scan WiFiScan.o -lmnl -lglib-2.0 -ldbus-1 -ldbus-glib-1 -lgobject-2.0 -lgio-2.0 -lboost_system -lboost_filesystem -lboost_thread -lboost_program_options -lboost_log_setup -lboost_log -lboost_date_time -lssl -lcrypto -lpthread -lmsgpackc -lLogger -lApplication -lNetwork -lUtility
libApplication.so:未定义对 Logger::Log::SystemLog(...) 的引用
但是 Logger::Log::SystemLog(...) 在库链接 -lLogger 中,我可能在这里遗漏了什么?
谢谢。
亲切的问候。
【问题讨论】:
-
尝试在最后再添加一次
-lLogger。 -
最好使用
CMake构建系统。除非你在做这个练习。 -
-l参数的相对顺序很重要!粗略地说,链接器从左到右读取它们,如果在遇到-lLib时,以前的代码不需要该库,它将被遗忘。所以,如果Application使用来自Logger的东西,你会得到一个未定义的引用。检查库的顺序。如果您有循环依赖,请再次重复一些库或使用-Wl,--start-group/-Wl,--end-group。