Cmake 对“shm#u open';”的未定义引用我怎样才能找出罪犯呢?
我正试图针对库构建一个简单的程序,库本身依赖于librt。该库编译得很好,并且使用了Cmake 对“shm#u open';”的未定义引用我怎样才能找出罪犯呢?,cmake,arm,real-time,ld,Cmake,Arm,Real Time,Ld,我正试图针对库构建一个简单的程序,库本身依赖于librt。该库编译得很好,并且使用了-lrt标志。该程序还使用cmake在amd64上构建良好,但在arm64上失败。这不是交叉编译,而是直接在目标上构建它。我使用的是一个普通的cmake构建系统(cmake..;make) 完全相同的构建系统也可以编译不同的程序,它使用相同的库,但不使用相同的函数 以下是生成错误: [100%] Linking C executable mrun-talker /usr/lib/gcc/aarch64-linux
-lrt
标志。该程序还使用cmake在amd64上构建良好,但在arm64上失败。这不是交叉编译,而是直接在目标上构建它。我使用的是一个普通的cmake构建系统(cmake..;make)
完全相同的构建系统也可以编译不同的程序,它使用相同的库,但不使用相同的函数
以下是生成错误:
[100%] Linking C executable mrun-talker
/usr/lib/gcc/aarch64-linux-gnu/7/../../../../lib/libsec-common.so: undefined reference to `shm_open'
/usr/lib/gcc/aarch64-linux-gnu/7/../../../../lib/libsec-common.so: undefined reference to `shm_unlink'
下面是链接器命令:
/usr/bin/cc CMakeFiles/sec-talker.dir/main.c.o -o sec-talker -lsec-common -lsec-rosc -lsec-api -ltert -lgcov -lm -lrt -lpthread
linker命令在命令末尾包含-lrt
标志,并且lrt.so在目标上可用
是否有可能,尽管库编译得很好,但它没有正确链接,并在我尝试使用它时导致此错误
完整cmake文件:
get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(REPLACE " " "_" ProjectId ${ProjectId})
project(${ProjectId})
set(ExecName ${ProjectId})
enable_language(C)
find_package(Threads)
add_executable(${ExecName} main.c)
target_link_libraries(
${ExecName}
# sec libraries
sec-common
sec-rosc
sec-api
tert
# system libraries
gcov
m
Threads::Threads
rt
)
link_directories("/usr/local/lib")
install(TARGETS ${ExecName})
/编辑
我使用ldd检查libsec公用程序的链接。以下是(工作)amd64版本的结果:
# ldd /usr/lib/libsec-common.so
linux-vdso.so.1 (0x00007fff7e922000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffa350ef000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffa356ec000)
和(不工作)arm64版本
# ldd /usr/lib/libsec-common.so
linux-vdso.so.1 (0x0000ffffb2dc6000)
libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffffb2c26000)
/lib/ld-linux-aarch64.so.1 (0x0000ffffb2d9b000)
我看不出这里有什么问题。这里的问题是依赖项本身没有正确链接它的依赖项。您能发布所使用的确切链接器命令吗?
-lrt
是否在末尾?特别是,它是在-lsec common
之后指定的吗?您能在问题帖子中以文本形式显示您的CMake文件吗?另外,您可以按照您在问题帖子中的描述添加完整链接器命令吗?我添加了请求的部分。未定义的引用
在已经构建的libsec common中。因此
库表示库本身或其使用环境存在问题。此库本身应包含对所有其他所需库的引用。而且,如果这些所需的库与构建libsec common.so
时使用的库相同,则不应找到未定义的引用。您是如何构建libseccommon.so
库的?也在目标机器上,或者通过其他方式?库也构建在目标机器上。更准确地说:使用GitLab CI,我在AWS上的ARM64机器上构建docker容器中的所有内容(来自同一个图像)。然后将这些项目打包到Debian包中。在构建实际程序的CI中,我使用before_脚本安装debian软件包中的所有依赖项。让我大吃一惊的是,同样的管道适用于amd64体系结构,但在arm64体系结构中存在这个问题。我将进一步调查图书馆。有没有什么工具可以用来检查二进制文件中的链接?