在CMake中将仅包含头文件的库添加到可执行文件

ukxgm1gy  于 2022-11-11  发布在  其他
关注(0)|答案(2)|浏览(212)

我试图将Windows GNU GSL头文件库(从https://gnuwin32.sourceforge.net/packages/gsl.htm下载)包含到C++的示例代码中,但不幸的是,有很多错误。
下面是我的存储库的结构:

folder/
      gsl/
          gsl_sf_bessel.h
          gsl_mode.h
          *.h # other header files
      main.cpp
      CMakeLists.txt

main.cpp是这样的:


# include <stdio.h>

# include <gsl_sf_bessel.h>

int main (void)
{
  double x = 5.0;
  double y = gsl_sf_bessel_J0 (x);
  printf ("J0(%g) = %.18e\n", x, y);
  return 0;
}

和CMakeLists.txt文件中创建一个文件夹:

cmake_minimum_required(VERSION 3.0.0)
project(demoproject VERSION 0.1.0)

add_executable(
    demoexecutable
    main.cpp
    )

target_include_directories(
    demoexecutable
    PUBLIC
    gsl/
    )

当编译main.cpp时,我得到的错误是:

fatal error: gsl/gsl_mode.h: No such file or directory
[build]    26 | #include <gsl/gsl_mode.h>

看起来它设法从gsl/中找到了gsl_sf_bessel.h,但是gsl_sf_bessel.h需要gsl_mode.h,而编译器却找不到。有什么办法可以解决这个问题吗?
我在CMakeLists.txt中尝试了不同的函数组合,如add_libraryinclude_directoriestarget_link_libraries,但不幸的是没有任何效果。

oyxsuwqo

oyxsuwqo1#

尝试将${CMAKE_CURRENT_SOURCE_DIR}添加为包含目录。该目录包含gsl/gsl_mode.hgsl目录不包含其自身,因此将其添加为包含目录将不会消除该错误。

tuwxkamq

tuwxkamq2#

我在我的CMake项目中采用了以下做法:

1)项目的文件夹结构。

有一个include/${PROJECT_NAME}子文件夹(即include子文件夹,以及其中另一个以项目名称命名的子文件夹)。例如,在您的情况下:

demoproject_or_whatever
|- include
|   \- demoproject
|      \- gsl
|         |- gsl_sf_bessel.h
|         \- gsl_mode.h
|- src
\- test

2)源代码/CMakeLists. txt文件。

在文件的顶部设置一个include_dir变量,然后在设置可执行文件的target_include_directories时使用它。

set(include_dir ${PROJECT_SOURCE_DIR}/include/${PROJECT_NAME})

add_executable(${PROJECT_NAME} ${app_sources})

target_include_directories(${PROJECT_NAME} PUBLIC
    "$<BUILD_INTERFACE:${include_dir}>"
    "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
)

3.包括来自源文件的头文件。

使用相对于include/${PROJECT_NAME}的路径。


# include <gsl/gsl_sf_bessel.h>

相关问题