对 `shm_open' 的未定义引用 - 我怎样才能查明罪魁祸首?
undefined reference to `shm_open' - how can I pinpoint the culprit?
我正在尝试针对一个本身依赖于 librt 的库构建一个简单的程序。该库编译得很好,并且在那里使用了 -lrt
标志。该程序还使用 cmake 在 amd64 上构建良好 - 但在 arm64 上,它失败了。这不是交叉编译,而是直接在target上构建。我使用的是普通的 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'
这里是 linker 命令:
/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 在目标上可用。
是否有可能虽然该库编译得很好,但它没有正确 link 并在我尝试使用它时导致此错误?
完整的 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-common 的 linking。这是(工作)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)
我在这里没发现问题。
这里的问题是依赖本身没有正确link它是依赖。
我正在尝试针对一个本身依赖于 librt 的库构建一个简单的程序。该库编译得很好,并且在那里使用了 -lrt
标志。该程序还使用 cmake 在 amd64 上构建良好 - 但在 arm64 上,它失败了。这不是交叉编译,而是直接在target上构建。我使用的是普通的 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'
这里是 linker 命令:
/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 在目标上可用。
是否有可能虽然该库编译得很好,但它没有正确 link 并在我尝试使用它时导致此错误?
完整的 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-common 的 linking。这是(工作)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)
我在这里没发现问题。
这里的问题是依赖本身没有正确link它是依赖。