【发布时间】: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 更新。
-
它与 CMake 无关。见Why C++ linker is silent about ODR violation?
-
这就是编译器(链接器)的工作方式。
-
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