【问题标题】:CMake cannot detect symbol conflicts in different static librariesCMake 无法检测不同静态库中的符号冲突
【发布时间】:2020-08-01 17:39:48
【问题描述】:

我创建了一个简单的 cmake 项目来复制它。

├── CMakeLists.txt
├── lib1
│   ├── CMakeLists.txt
│   ├── lib1.cpp
│   └── lib1.h
├── lib2
│   ├── CMakeLists.txt
│   ├── lib2.cpp
│   └── lib2.h
└── main.cpp

lib1/CMakeLists.txt:

add_library(lib1 "")
target_include_directories(lib1
  PUBLIC
      ${CMAKE_CURRENT_LIST_DIR}
)
target_sources(lib1
    PRIVATE
        lib1.cpp
        lib1.h
)

在lib1.cpp中,有一个函数“void say()”:

#include <stdio.h>

void say()
{
    printf("hello from lib1\n");
}

lib2/CMakeLists.txt:

add_library(lib2 "")
target_include_directories(lib2
  PUBLIC
      ${CMAKE_CURRENT_LIST_DIR}
)
target_sources(lib2
    PRIVATE
        lib2.cpp
        lib2.h
)

而在lib2/lib2.cpp中,有一个签名相同的函数:

#include <stdio.h>
void say()
{
    printf("hello from lib2\n");
}

CMakeLists.txt:

cmake_minimum_required(VERSION 3.16)
project(shell LANGUAGES CXX)
add_subdirectory(lib1)
add_subdirectory(lib2)
add_executable(test2
  main.cpp
)
target_link_libraries(test2
  PRIVATE
    lib1
    lib2
)

这里是main.cpp:

void say();
int main()
{
    say();
    return 0;
} 

输出:

hello from lib1

没有编译或链接错误,甚至没有警告。 链接器只选择了一个并简单地忽略了另一个。 我正在使用 cmake 3.16,并使用 msvc 2017/2019 和 g++ 7.5 对其进行了测试。

静态库中出现符号冲突时如何让链接器提示错误?

谢谢!

【问题讨论】:

  • 你能显示 CMakeLists.txt 吗?仅当您将所有内容实际链接到可执行文件时才会发生链接。但是您应该在应用程序的 CMakeLists.txt 中指定,例如:add_executable(main); target_link_libraries(主 lib1 lib2)
  • @André,使用 CMakeLists.txt 更新。
  • 这就是编译器(链接器)的工作方式。
  • It may be not to do with CMake, but there should be a way to make it work in CMake 不,这与 cmake 无关。 Cmake 不会编译你的代码。

标签: c++ cmake symbols conflict


【解决方案1】:

静态库中出现符号冲突时如何让链接器提示错误?

对于gcc,使用--whole-archive 选项将每个对象文件包含在存档中,而不是在存档中搜索所需的符号。

由于我知道没有 cmake 支持,我发现它通常在链接可执行文件时完成:

target_link_libraries(test2 PRIVATE
    -Wl,--whole-archive
    lib1
    lib2
    -Wl,--no-whole-archive
)

“符号冲突”是一个相当模糊的术语。这只会检测多个符号定义。符号类型在编译后不会存储在任何地方。

【讨论】:

  • 谢谢!它适用于 Linux。是否有与 msvc 等效的选项?我试过 /WHOLEARCHIVE,但它不起作用。
  • 我不喜欢也不使用 msvc,所以我不知道 :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 2017-10-03
  • 2020-11-03
  • 2023-03-28
  • 2012-02-24
  • 2021-09-02
相关资源
最近更新 更多