Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.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
C++ 链接器在库中找不到符号_C++_C_Cmake_Linker - Fatal编程技术网

C++ 链接器在库中找不到符号

C++ 链接器在库中找不到符号,c++,c,cmake,linker,C++,C,Cmake,Linker,我使用CMake构建了一个C库。以下是库的CmakeList文件: cmake_minimum_required(VERSION 3.7) project(sshserial) set(CMAKE_C_STANDARD 99) include_directories(BEFORE SYSTEM ${CMAKE_SOURCE_DIR}/common/include) link_directories(${CMAKE_SOURCE_DIR}/common/lib) set(SOURCE_FIL

我使用CMake构建了一个C库。以下是库的CmakeList文件:

cmake_minimum_required(VERSION 3.7)
project(sshserial)

set(CMAKE_C_STANDARD 99)

include_directories(BEFORE SYSTEM ${CMAKE_SOURCE_DIR}/common/include)
link_directories(${CMAKE_SOURCE_DIR}/common/lib)

set(SOURCE_FILES sshserial.c sshserial.h)
add_library(sshserial ${SOURCE_FILES})

TARGET_LINK_LIBRARIES(sshserial libssh.a)
我在C++程序中使用这个库。以下是该计划的CMakeLists文件:

cmake_minimum_required(VERSION 3.7)
project(sshtest)

set(CMAKE_CXX_STANDARD 11)

include_directories(BEFORE SYSTEM ${CMAKE_SOURCE_DIR}/common/include)
link_directories(${CMAKE_SOURCE_DIR}/common/lib)

set(SOURCE_FILES main.cpp)
add_executable(sshtest ${SOURCE_FILES})

TARGET_LINK_LIBRARIES(sshtest libsshserial.a)
我已将库复制到正确的文件夹中。在库上运行
nm
时,我得到以下结果:

$ nm libsshserial.a 

libsshserial.a(sshserial.c.o):
                 U ___error
                 U ___stack_chk_fail
                 U ___stack_chk_guard
                 U ___stderrp
                 U ___stdinp
0000000000000330 T _create_session
                 U _exit
                 U _fgets
                 U _fprintf
                 U _free
                 U _getpass
0000000000000490 T _read_from_session
                 U _ssh_channel_close
                 U _ssh_channel_free
                 U _ssh_channel_new
                 U _ssh_channel_open_session
                 U _ssh_channel_read
                 U _ssh_channel_request_exec
                 U _ssh_channel_send_eof
                 U _ssh_connect
                 U _ssh_disconnect
                 U _ssh_free
                 U _ssh_get_error
                 U _ssh_get_hexa
                 U _ssh_get_pubkey_hash
                 U _ssh_is_server_known
                 U _ssh_new
                 U _ssh_options_set
                 U _ssh_print_hexa
                 U _ssh_userauth_password
                 U _ssh_write_knownhost
                 U _strerror
                 U _strncasecmp
0000000000000000 T _verify_knownhost
                 U _write
当我尝试构建程序时,会出现以下链接器错误:

Undefined symbols for architecture x86_64:
  "create_session()", referenced from:
      _main in main.cpp.o
  "read_from_session(ssh_session_struct*)", referenced from:
      _main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [sshtest] Error 1
make[2]: *** [CMakeFiles/sshtest.dir/all] Error 2
make[1]: *** [CMakeFiles/sshtest.dir/rule] Error 2
make: *** [sshtest] Error 2
我被困在这里已经有一段时间了,我确信我错过了一些琐碎的事情。我做错了什么

另外,我在Mac上

$ uname -a
Darwin XXXXXX 15.6.0 Darwin Kernel Version 15.6.0: Tue Apr 11 16:00:51 PDT 2017; root:xnu-3248.60.11.5.3~1/RELEASE_X86_64 x86_64

问题是C++使用的。要禁止使用C代码> C函数>外部“C”,但只有在C++编译器编译的情况下才需要声明C函数。您可以用<代码>、“.cPLUS PLUS”/Cuff>宏检查,这在编译C++时定义,但编译C.

时没有定义。 在声明函数原型的头文件中,执行以下操作

#ifdef __cplusplus
// Being compiled by a C++ compiler, inhibit name mangling
extern "C" {
#endif

// All your function prototype declarations here

#ifdef __cplusplus
}  // End of extern "C"
#endif

为什么不将测试项目作为库项目的子项目(在子文件夹中)?然后,你可以做<代码> TAGTHOLKKLULL库(SSHStSyScript),CMake自动设置MaFo文件与库链接。在C++编译时,你在使用函数时声明使用<代码>外“C”/>代码吗?@一些程序员:我现在可以试试,我会的。但是后来我想在其他项目中使用C库,所以我想这不是一个永久的解决方案。@Someprogrammerdude:这个库是用CYes构建的,这很可能就是问题所在。C和C++在很多方面不同,对于一个C++用途来说,支持其他事物的重载。这意味着非C++库的函数声明需要加前缀或用
extern“C”
包围,以防止名称损坏,因为C不会“损坏”名称。正如我在帖子评论中所指出的,库是用C构建的,所以我不需要用
extern“C”装饰导出的符号<代码> @ Nakiya如果你想使用C++中的函数,那么你需要它!故事结束了!试试看。@nakiya或者,如果它是第三方库,您可以将
#include
括在
extern“C”{..}
中。