Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake 对“shm#u open';”的未定义引用我怎样才能找出罪犯呢?_Cmake_Arm_Real Time_Ld - Fatal编程技术网

Cmake 对“shm#u open';”的未定义引用我怎样才能找出罪犯呢?

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

我正试图针对库构建一个简单的程序,库本身依赖于librt。该库编译得很好,并且使用了
-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体系结构中存在这个问题。我将进一步调查图书馆。有没有什么工具可以用来检查二进制文件中的链接?