Boost 从Makefile迁移到CMake时出错

Boost 从Makefile迁移到CMake时出错,boost,cmake,Boost,Cmake,我有一个库,它使用Makefile编译时不会出错。 现在我想切换到CMake,但它不起作用 源代码和生成文件是。 在我保存的所有文件夹中,有以下内容:can\u socket、can\u virtual、timers\u xeno、timers\u rtpreempt、timers\u unix、unix 这是我的简历: cmake_minimum_required(VERSION 2.4.6) project(ikarus_arm_common C CXX) #set the defaul

我有一个库,它使用Makefile编译时不会出错。 现在我想切换到CMake,但它不起作用

源代码和生成文件是。 在我保存的所有文件夹中,有以下内容:
can\u socket、can\u virtual、timers\u xeno、timers\u rtpreempt、timers\u unix、unix

这是我的简历:

cmake_minimum_required(VERSION 2.4.6)
project(ikarus_arm_common C CXX)


#set the default path for built executables to the "bin" directory
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#set the default path for built libraries to the "lib" directory
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)


find_package(Boost COMPONENTS filesystem system serialization REQUIRED)

set(CAN_MASTER_INCLUDE_DIR include)

include_directories( ${Boost_INCLUDE_DIRS}  
    ${CAN_MASTER_INCLUDE_DIR} 
    ${CAN_MASTER_INCLUDE_DIR}/boost
    ${CAN_MASTER_INCLUDE_DIR}/timers_rtpreempt
    ${CAN_MASTER_INCLUDE_DIR}/timers_unix
    ${CAN_MASTER_INCLUDE_DIR}/timers_xeno
    ${CAN_MASTER_INCLUDE_DIR}/unix
    /usr/xenomai/include

)

set(CAN_FESTIVAL_CPP drivers/unix/unix.c
    drivers/timers_xeno/timers_xeno.c
    drivers/can_socket/can_socket.c
)

add_library(canfestival ${CAN_FESTIVAL_CPP})
编辑:

当我尝试编译时,它返回以下错误:

> $ make 
> [  9%] Building C object
> CMakeFiles/canfestival.dir/drivers/unix/unix.o 
> In file included from
> /home/luca/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/include/can.h:28:0,
>     from /home/luca/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/include/canDispatch.h:23,
>     from /home/luca/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/drivers/unix/unix.c:36:
> /usr/include/boost/function.hpp:13:57: fatal error: functional: No
> such file or directory compilation terminated. make[2]: ***
> [CMakeFiles/canfestival.dir/drivers/unix/unix.o] Error 1 make[1]: ***
> [CMakeFiles/canfestival.dir/all] Error 2 make: *** [all] Error 2
我认为其中一个问题是由于某些文件的扩展名为
.c
,但需要boost。如果修改文件
unix.cpp和can_socket.cpp
的扩展名,而
timers\u xeno
返回错误:

luca@luca-vmware:~/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/build$ make
[  9%] Building CXX object CMakeFiles/canfestival.dir/drivers/unix/unix.o
[ 18%] Building CXX object CMakeFiles/canfestival.dir/drivers/timers_xeno/timers_xeno.o
/home/luca/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/drivers/timers_xeno/timers_xeno.cpp: In function ‘void CreateReceiveTask(CAN_PORT, pthread_t*, void (*)(void*))’:
/home/luca/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/drivers/timers_xeno/timers_xeno.cpp:250:75: error: cannot convert ‘pthread_t* {aka long unsigned int*}’ to ‘RT_TASK* {aka rt_task_placeholder*}’ for argument ‘1’ to ‘int rt_task_create(RT_TASK*, const char*, int, int, int)’
/home/luca/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/drivers/timers_xeno/timers_xeno.cpp:256:70: error: cannot convert ‘pthread_t* {aka long unsigned int*}’ to ‘RT_TASK* {aka rt_task_placeholder*}’ for argument ‘1’ to ‘int rt_task_start(RT_TASK*, void (*)(void*), void*)’
/home/luca/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/drivers/timers_xeno/timers_xeno.cpp: In function ‘void WaitReceiveTaskEnd(pthread_t*)’:
/home/luca/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/drivers/timers_xeno/timers_xeno.cpp:270:38: error: cannot convert ‘pthread_t* {aka long unsigned int*}’ to ‘RT_TASK* {aka rt_task_placeholder*}’ for argument ‘1’ to ‘int rt_task_join(RT_TASK*)’
/home/luca/ArmIkarus/ikarus_arm_stack/ikarus_arm_common/drivers/timers_xeno/timers_xeno.cpp:273:36: error: cannot convert ‘pthread_t* {aka long unsigned int*}’ to ‘RT_TASK* {aka rt_task_placeholder*}’ for argument ‘1’ to ‘int rt_task_delete(RT_TASK*)’
make[2]: *** [CMakeFiles/canfestival.dir/drivers/timers_xeno/timers_xeno.o] Error 1
make[1]: *** [CMakeFiles/canfestival.dir/all] Error 2
make: *** [all] Error 2

< >我如何解决这个问题?< /p>如果代码作者将这些文件编译成C,则不应该将它们编译为C++。当这些文件具有
.c
扩展名时,会出现什么问题?@arrowdoger请查看更新的问题。我插入了你需要的信息。这是作者代码的问题。问他为什么在C源中包含C++头。@ ARRODODGER是的,但问题是,为什么它用MaFag文件编译而不是用CMake编译??您可以尝试比较用于编译该源代码的命令行。对于CMake,请使用
使VERBOSE=1