CMake中TARGET_LINK_LIBRARIES如何包含多个静态库?

6

我遇到了一个由CMake引起的多重定义链接问题,这是一个依赖于包含静态库的共享库的可执行文件。

我创建了一个名为foo的共享库,它依赖于静态库bar

add_library(foo SHARED foo.cpp)
target_link_libraries(foo bar)

根据定义,bar 的内容位于库 foo 中。 然后我创建了一个依赖于 foo 的可执行文件 exe
add_executable(exe exe.cpp)
target_link_libraries(exe foo)

在链接时,我收到一个“多次定义”警告/错误,告诉我库“bar”中的函数出现了两次。查看链接命令时,我发现“exe”与“bar”和“foo”链接在一起,这是不一致的。
在依赖声明中是否有遗漏?我错过了一个神奇的“CMake”关键字吗?

你需要一个 http://sscce.org/。 - steveire
他所强调的问题是一个常见的问题。任何熟悉CMake的老手都知道他的意思 :-) - Richard Hodges
1个回答

7
像这样:
add_library(foo SHARED <foo source files>)
target_link_libraries(foo PRIVATE bar)

如果其他库与foo链接,请确保使用CMake 关键字PRIVATEPUBLICINTERFACE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接