问题:我正在CMake中构建一个外部项目.该项目有一个Makefile,最终生成一个共享对象.我想链接并在我的超级项目中安装此对象,就像它是项目中的一个库一样.问题是ExternalProject lib是通过相对路径链接到我的应用程序和库,而不是从CMake放置的任何目录运行时导致问题的绝对路径.
我已经创建了一个示例SSCCE示例项目来演示我的整体设置.如果需要,请随意阅读和编译(git clone https://github.com/calebwherry/cmake-SO-question-main --recursive && cd cmake-SO-question-main && mkdir build && cd build && cmake .. && make && cd src/app/testApp && ldd testApp).
每当我运行ldd可执行文件和库时,我得到如下输出:
linux-vdso.so.1 => (0x00007fff8b5a2000)
libTestLib.so => /home/jwherry3/repos/cmake-superprj-main-test/build/src/lib/TestLib/libTestLib.so (0x00007f592da57000)
../../lib/libExtLib.so (0x00007f592d855000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f592d539000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f592d2b7000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f592d0a0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f592cd14000)
/lib64/ld-linux-x86-64.so.2 (0x00007f592dc5a000)
Run Code Online (Sandbox Code Playgroud)
我已经尝试过处理RPATHS的各种事情,但无法将ExtLib连接到正确的位置.项目本地的lib(libTestLib.so)链接就好了.
我还试图LD_LIBRARY_PATH在运行应用程序时设置覆盖相对路径,但即使我这样做,它仍然找不到库.我想因为它是相对的,它不遵循正常的链接顺序?结果是二进制文件不会运行,除非我在它所在的目录中.
我觉得在使用ExternalProject创建依赖项时,我正在做一些非常愚蠢的事情,这是我的问题,但是我已经打了3天,并没有想出任何东西.
系统设置:Debian Wheezy 64位,CMake 3.0.2,g ++ - 4.9.2.
花了一段时间,但在CMake用户列表服务(特别是@ brad-king)的帮助下,我终于找到了答案。
主要问题是我没有在外部项目中正确编译共享对象。布拉德回答我的问题:
感谢您提供完整/简单的示例。问题是外部项目生成的libExtLib.so文件没有链接器设置的DT_SONAME。当给链接器指定没有soname的共享库文件的路径时,该路径将被复制到使用者的DT_NEEDED字段中,因为它没有用于此的soname。
有两种解决方案:
确保外部构建系统正确设置了DT_SONAME。
告诉CMake导入的库文件没有soname:
set_property(TARGET ExtLib属性IMPORTED_NO_SONAME 1)
然后,CMake将通过-lExtLib链接它,并且链接器不会将文件路径存储在DT_NEEDED中,而只会存储文件名。
这些都应该解决问题。1号更清洁。
由于我可以控制外部库中的Make文件,因此我选择了更干净的第一个解决方案,方法是编译共享对象,如下所示:
$(SHARED_TARGET): $(OBJECTS)
$(CXX) $(CXXFLAGS) $(OBJECTS) -o $@ $(LDFLAGS) -Wl,-soname,$@
我已经修改了原始示例并将其简化了很多:https : //github.com/calebwherry/cmake-SO-question-main。我将其留作参考,以供日后在本帖子中绊倒的任何人参考。
聚苯乙烯
还有另一个次优的修复方法。如果没有执行上述任何操作,则可以给target_link_library所链接的库的完整路径,而不使用导入的库目标。我已经在回购的CMake文件中注意到了这一点,并对其进行了注释。这不是一个很好的解决方案,但确实以另一种方式解决了该问题。
| 归档时间: |
|
| 查看次数: |
1641 次 |
| 最近记录: |