使用CMake的Linux RT交叉编译代码,未定义对“DAQmxCreateTask”的引用

slmsl1lt  于 2023-01-20  发布在  Linux
关注(0)|答案(1)|浏览(154)

我试图使用VSCodeLinux RT交叉编译一个C代码和CMake。但是我遇到了一个错误,这是由于将(.so)文件与项目链接时出错。我尝试了许多解决方案,但未能运行该任务。我的代码如下所示:

`     #include<stdio.h>
      #include"/home/admin/helloworld/src/NIDAQmx.h"

      TaskHandle taskHandle=0;
      int ret=0;

      void main()
      {
      printf("Hello world");
      ret=DAQmxCreateTask("task",&taskHandle);
      printf("Return for creating task is %d\n",ret);
      DAQmxStopTask (taskHandle);
      DAQmxClearTask(taskHandle);
      printf("Task closed ");

      }               `

运行任务时出错

`[ 50%] Linking C executable bin/helloWorld
 CMakeFiles/helloWorld.dir/home/admin/helloworld/src/helloWorld.c.o: In function `main':
 /home/admin/helloworld/src/helloWorld.c:11: undefined reference to `DAQmxCreateTask'
/home/admin/helloworld/src/helloWorld.c:13: undefined reference to `DAQmxStopTask'
/home/admin/helloworld/src/helloWorld.c:14: undefined reference to `DAQmxClearTask'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/helloWorld.dir/build.make:95: bin/helloWorld] Error 1
make[1]: *** [CMakeFiles/Makefile2:68: CMakeFiles/helloWorld.dir/all] Error 2

 *  The terminal process "/bin/bash '-c', 'make'" failed to launch (exit code: 2). 
 *  Terminal will be reused by tasks, press any key to close it.  `

我修改了我的CMakeLists.txt如下:

`     cmake_minimum_required(VERSION 3.7.2)
      # project settings
      project(helloWorld VERSION 0.1.0)
      set(CMAKE_RUNTIME_OUTPUT_DIRECTORY bin)
      set(CMAKE_GENERATOR "Unix Makefiles")
      # executable settings
      add_executable(helloWorld ../src/helloWorld.c)
      set(CMAKE_BUILD_TYPE Debug)
      LINK_LIBRARIES(NIDAQmx ../src/libnidaqmx.so)
                             `

如果我删除了与NIDAQmx代码正常工作相关的元素。

nsc4cvqm

nsc4cvqm1#

命令link_libraries仅影响可执行文件和库,在之后添加了。从documentation
将库链接到以后添加的所有目标。
因此,您需要将可执行文件移动到该命令之后:

link_libraries(NIDAQmx ../src/libnidaqmx.so)
...
add_executable(helloWorld ../src/helloWorld.c)

此外,最好避免使用link_libraries命令,而使用target_link_libraries命令,在target_link_libraries命令中,您可以显式指定要与给定库链接的目标:

add_executable(helloWorld ../src/helloWorld.c)
...
target_link_libraries(helloWorld NIDAQmx ../src/libnidaqmx.so)

相关问题