我在一个项目中使用 CMake,我正在尝试静态链接一些库。我已经设置:
set(BUILD_SHARED_LIBS OFF)
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -static")
set_target_properties(icarus PROPERTIES LINK_SEARCH_END_STATIC 1)
我已经确定在寻找我拥有 *.a 版本的实际库时。
目前该项目进口:
libPocoNet.a
libPocoUtil.a
libPocoXML.a
libPocoFoundation.a
libmysqlclient.a
libmysqlpp.a
libcrypto++.a
CUDA
找到所有库,并且在进行动态/共享链接时,它们工作正常。我也尝试设置编译标志:
set(GCC_CXX_FLAGS ${GCC_CXX_FLAGS} "-static-libgcc -static-libstdc++ -static")
但无济于事。虽然我在编译时没有遇到任何问题,但对于在上述库中找到的调用,链接会引发很多未定义的引用错误,即:
undefined reference to `mysql_thread_init'
undefined reference to `mysql_real_query'
undefined reference to `pthread_mutex_unlock'
undefined reference to `Poco::ErrorHandler::handle()'
不是按照那个特定的顺序,每个库都有很多错误。
查看 GCC 的最后一行,我看到:
/usr/bin/c++ -g -g -static-libgcc -static-libstdc++ -static [list of *.cpp files]
-o icarus -rdynamic /usr/local/lib/libPocoFoundation.a /usr/local/lib/libPocoNet.a
/usr/local/lib/libPocoUtil.a /usr/local/lib/libPocoXML.a
-Wl,-Bstatic -lmysqlclient -lmysqlpp -lcrypto++
这让我想知道:
- 为什么 Poco 库链接为 -rdynamic,并且没有 -Wl -Bstatic 标志?好像它们被从静态链接中跳过/排除。
- mysqlclient、mysqlpp 和 crypto++ 似乎设置为静态链接,但我仍然收到错误
所以,有人可以向我解释一下:
- 如何使用 CMake 设置部分静态链接
- CMAKE_EXE_LINKER_FLAGS 是我唯一需要设置的吗?
- 我应该为提到的库而不是整个项目强制静态链接吗?
如果这些问题太多或太本地化,请原谅,我以前没有尝试过,而且我似乎在网上找不到太多信息。