对 `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它是依赖。