【问题标题】:Cmake with a simple main and library带有简单主库和库的 Cmake
【发布时间】:2021-12-03 09:08:36
【问题描述】:

我尝试了很多命令,最后放弃了。 我知道我过去做过。 但是请告诉我为什么它不起作用:,( 它只是一个带有小库 testlib.h 的 main.c

$cmake ..

-- Configuring done
CMake Error at CMakeLists.txt:15 (add_library):
  Cannot find source file:

    PUBLIC

  Tried extensions .c .C .c++ .cc .cpp .cxx .cu .mpp .m .M .mm .ixx .cppm .h
  .hh .h++ .hm .hpp .hxx .in .txx .f .F .for .f77 .f90 .f95 .f03 .hip .ispc


CMake Error at CMakeLists.txt:15 (add_library):
  No SOURCES given to target: lib

CMakeLists.txt:

    cmake_minimum_required(VERSION 3.0)
project(WTF)

add_executable(result main.c)
set_target_properties(result PROPERTIES
    C_STANDARD 11
    C_STANDARD_REQUIRED ON
    C_EXTENSIONS OFF
    
)
set (DIR "${CMAKE_CURRENT_SOURCE_DIR}")
set (DIRLIBS "${CMAKE_CURRENT_SOURCE_DIR}/libs")
message("${DIRLIBS}")
message("${DIR}")
add_library(lib PUBLIC testlib.h testlib.c)
target_include_directories(result PUBLIC ${DIR} ${DIRLIBS} )
set_target_properties(result PROPERTIES LINKER_LANGUAGE CXX)
target_link_libraries(result PUBLIC lib )

$cmake --build .

usr/bin/ld: cannot find -ltestlib.h
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/result.dir/build.make:97: result] Error 1
make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/result.dir/all] Error 2
make: *** [Makefile:91: all] Error 2

ma​​in.c

#include "testlib.h"
#include <stdio.h>
//#include "libs/lib2.h"
int main(void){
printf("hw");
f1();

testlib.h

   void f1(void);

testlib.c

  #include <stdio.h>
#include "testlib.h"
void f1(void){
printf("f1");}

【问题讨论】:

  • 大声笑首先我以为我没注意什么。但是后来我将它与一个旧项目进行了比较,它确实是相同的 xD 但是好吧,也许我错过了一些东西。告诉我:D
  • 天哪,太可怕了。我还有另一个(更大的)项目。我只是将 testlib.h 添加到 main.c 旁边的工作区中。我还使用 target_include_directories 添加了这个路径(可能会再次添加)。它还说找不到testlib.h...啊,我也写到:target_link_libraries
  • target_link_libraries(result PUBLIC testlib.h ) :您包含头文件而不是库
  • 使用 target_include_directories() 包含标题
  • 啊好吧,让我把它改成图书馆

标签: cmake


【解决方案1】:

试试这个 CMakeLists.txt

cmake_minimum_required(VERSION 3.0)
project(WTF)

add_executable(result main.c)
set_target_properties(result PROPERTIES
    C_STANDARD 11
    C_STANDARD_REQUIRED ON
    C_EXTENSIONS OFF
    
)
set (DIR "${CMAKE_CURRENT_SOURCE_DIR}")
set (DIRLIBS "${CMAKE_CURRENT_SOURCE_DIR}/libs")
message("${DIRLIBS}")
message("${DIR}")
add_library(test STATIC testlib.h testlib.c)
target_include_directories(result PUBLIC ${DIR} ${DIRLIBS} )
set_target_properties(result PROPERTIES LINKER_LANGUAGE CXX)
target_link_libraries(result PUBLIC test )

问题在于 add_library() 的语法使用 [STATIC |共享 | MODULE] 而不是 PUBLIC。

【讨论】:

  • 这行得通 :) 是的,错误消息让我感到困惑 xD 我应该阅读文档中的标志 :)
  • (谢谢你今天让我开心)
  • 乐于助人:)
猜你喜欢
  • 2013-04-07
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多