Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 停止将静态库的两个对象文件链接到静态库本身的cmake target_link_库_C++_Cmake - Fatal编程技术网

C++ 停止将静态库的两个对象文件链接到静态库本身的cmake target_link_库

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

我尝试在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 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
)与符号可见性无关。它们都是关于源文件的传播。