Cmake C制造-L<;路径>-l<;lib>;静态库的链接标志

Cmake C制造-L<;路径>-l<;lib>;静态库的链接标志,cmake,static-libraries,static-linking,Cmake,Static Libraries,Static Linking,我使用CMake 2.8构建基于MQX操作系统的应用程序(使用CodeWarrior)。 CMake项目基本上构建了一组静态库(比如LIB1和LIB2)。 然后,我在最终可执行的cmake规则中引用这些库: target_add_executable(X ${some_sources}) target_link_libraries(X LIB1 LIB2) 我的问题是一些符号在多个库中定义。 因此,可以使用如下链接命令: mwldarm <args> -o <output&g

我使用CMake 2.8构建基于MQX操作系统的应用程序(使用CodeWarrior)。
CMake项目基本上构建了一组静态库(比如LIB1和LIB2)。
然后,我在最终可执行的cmake规则中引用这些库:

target_add_executable(X ${some_sources})
target_link_libraries(X LIB1 LIB2)
我的问题是一些符号在多个库中定义。
因此,可以使用如下链接命令:

mwldarm <args> -o <output> <objects> /path/to1/libLIB1.a /path/to2/libLIB2.a
mwldarm <args> -o <output> <objects> -L/path/to1 -L/path/to2 -lLIB -lLIB2
mwldarm-o/path/to1/lib1.a/path/to2/lib2.a
会导致多重符号定义错误。 相反,我希望CMake生成如下链接命令:

mwldarm <args> -o <output> <objects> /path/to1/libLIB1.a /path/to2/libLIB2.a
mwldarm <args> -o <output> <objects> -L/path/to1 -L/path/to2 -lLIB -lLIB2
mwldarm-o-L/path/to1-L/path/to2-lLIB-lLIB2
问题:如何从CMAKE获取以下变量

  • 库目录标志(例如:
    -L/path/to1-L/path/to2
  • 库链接标志(例如:
    -lLIB-lLIB2
我读过关于RPATH的文章,但似乎只涉及到共享库。我说得对吗?

感谢您的提前通知。
我真的很感激。

看来政策可能正是你们所需要的

要使用它,请在
CMakeLists.txt的开头附近添加以下行:

CMAKE_POLICY( SET CMP0003 OLD )
另一种可能是直接设置依赖项和搜索路径,但这不是最干净的方法。假设您的库被称为
liba.a
libb.a
,那么:

LINK_DIRECTORIES( ${paths_to_search_for} )
TARGET_ADD_EXECUTABLE(X ${some_sources} )
ADD_DEPENDENCIES(X LIB1 LIB2)
TARGET_LINK_LIBRARIES(X a b )
请注意,在这种情况下,
a
b
不是cmake目标,因此需要一点机器来正确设置依赖项。

我认为是用于打开/关闭如官方文件所述自动添加搜索路径的功能

通过完整路径链接的库不再生成链接器搜索路径

而不是将路径名替换为
-l

链接库时,如果库是已知的目标CMake,则CMake始终使用库的路径名替换相关的
-L
-L
选项。这对于链接静态库来说可能不是问题。但对于链接共享库的可执行文件来说,这可能是一个问题。然后我发现了一种黑客攻击方法,代码如下,可以解决使用
-L
和`-L'而不是绝对路径链接shread库的问题

# Find out the link.txt      
set(LINK_TXT "${CMAKE_BINARY_DIR}/${ToLinkLib}/CMakeFiles/${ToLinkLIb}.dir/link.txt")

# Add the searching path into link command
add_custom_command(TARGET ${YourTarget} PRE_BUILD
  COMMAND sed ARGS -ie "\"s;[[:blank:]]-l; -L${LIBRARY_OUTPUT_PATH} -l;\"" ${LINK_TXT}
  DEPENDS ${LINK_TXT}
  COMMENT "Hacking CMake: edit __link.txt__ to use -l instead of path to link internal library ...")

# NOTE: Dont't missing the `-l'. 
target_link_libraries(${YourTarget} -l${ToLinkLib})
当然,这只是一个黑客行为,因此可能无法与所有版本的CMake一起正常工作


更新:为什么链接共享库可能会出现问题

当我运行一个为android交叉编译的可执行文件,它链接一个由相同的CMake脚本构建的共享库时,我遇到了链接失败的问题。在我使用上述黑客方法获得新版本后,我可以使用如下命令运行我的可执行文件

 $ LD_LIBRARY_PATH=. ./the_exe opts

CMake设计的一部分是与完整路径链接。为什么这是个问题

将行为与策略切换不是正确的方法


我在CMAKE文档中搜索到了与您相同的内容。我在发布此消息之前测试了它。然而,要么我没有正确地使用它,要么它什么也不做,因为cmake生成的link命令行完全相同,有没有CMP0003策略(旧的或新的!)。我确认,在我的情况下,这无法完成任务,因为所有库都是由同一个cmake项目生成的。正如CMAKE文档在CMP0003策略描述中所述:当链接行上的所有项目都具有已知路径时,CMAKE不会检查此策略,因此它没有效果。策略不是功能切换。请不要这样做,也不要建议其他人这样做。尽管存在连接线问题,但拥有多个符号似乎不是一件好事。你有没有考虑过将LIB1和LIB2的公共部分重构成一个唯一的库,这是两者的依赖关系?这就是我的想法!我认为你的答案是正确的(我是安德烈斯)