C++ 停止将静态库的两个对象文件链接到静态库本身的cmake target_link_库
我尝试在Windows上使用cmake+ninja+msvc构建一个相当大的共享库,它由子文件夹中的多个静态库组成。因此,根C++ 停止将静态库的两个对象文件链接到静态库本身的cmake target_link_库,c++,cmake,C++,Cmake,我尝试在Windows上使用cmake+ninja+msvc构建一个相当大的共享库,它由子文件夹中的多个静态库组成。因此,根CMakeLists.txt如下所示: project (sharedlib CXX) include(${CMAKE_CURRENT_LIST_DIR}/staticlib1/CMakeLists.txt) include(${CMAKE_CURRENT_LIST_DIR}/staticlib2/CMakeLists.txt) add_library(sharedlib
CMakeLists.txt
如下所示:
project (sharedlib CXX)
include(${CMAKE_CURRENT_LIST_DIR}/staticlib1/CMakeLists.txt)
include(${CMAKE_CURRENT_LIST_DIR}/staticlib2/CMakeLists.txt)
add_library(sharedlib SHARED)
target_link_libraries(sharedlib
staticlib1
staticlib2
)
set_target_properties(wux PROPERTIES LINK_FLAGS "/WHOLEARCHIVE")
其中,子文件夹staticlib1和staticlib2中的CMakeLists.txt
都类似于:
add_library(staticlib1 STATIC)
target_sources(staticlib1 PUBLIC
${CMAKE_CURRENT_LIST_DIR}/sourceA.cpp
${CMAKE_CURRENT_LIST_DIR}/sourceB.cpp
)
target_include_directories(staticlib1 PUBLIC
${CMAKE_CURRENT_LIST_DIR}/inc
)
target_compile_options(staticlib1 PUBLIC
/flag1
/flag2
)
当我运行cmake--build
时,staticlib1和staticlib2都可以生成,没有问题。酷。但当链接器尝试构建sharedlib时,cmake生成的rsp文件具有:
CMakeFiles\sharedlib.dir\staticlib1\sourceA.cpp.obj
CMakeFiles\sharedlib.dir\staticlib1\sourceB.cpp.obj
CMakeFiles\sharedlib.dir\staticlib2\sourceC.cpp.obj
CMakeFiles\sharedlib.dir\staticlib2\sourceD.cpp.obj
staticlib1.lib
staticlib2.lib
所以我得到链接器错误,因为符号被定义了两次。如何让cmake停止向链接器rsp添加对象和最终LIB
从技术上讲,事后我不需要静态lib。但是,我不能简单地切换到使用对象库。实际项目有约250个静态库,包括约3500个对象文件。链接器死掉(内存不足),只有一小部分对象文件
我必须先建立静态库,然后在事后将它们链接到共享库中,以绕过链接器的内存限制。我们当前的构建脚本很好地遵循了这种模式,所以我知道它是有效的。我只需要cmake遵循相同的模式。这是命令的效果:使用PUBLIC
关键字,它为库(静态)和链接该库的任何人添加源代码
您应该改为使用PRIVATE
关键字,或者最好在add_库中添加源代码
调用自身:
add_library(staticlib1 STATIC
${CMAKE_CURRENT_LIST_DIR}/sourceA.cpp
${CMAKE_CURRENT_LIST_DIR}/sourceB.cpp
)
在静态库中使用private是否意味着它们的符号不会在共享库中公开?
private
或其他关键字(PUBLIC
或INTERFACE
)与符号可见性无关。它们都是关于源文件的传播。