【问题标题】:"clang: error: linker command failed with exit code 1" on "ld: symbol(s) not found for architecture x86_64"“clang: error: linker command failed with exit code 1” on “ld: symbol(s) not found for architecture x86_64”
【发布时间】:2015-08-13 21:49:03
【问题描述】:

好吧,请多多指教,可能会很长,这里解决了一个相关问题(我认为):CMake make[2]: *** No rule to make target `/path/to/uthash/utarray.h', needed by `HelloTest'. Stop

我这几天一直在努力构建一个简单的“Hello World”程序,它混合了 C 和 C++,并使用 CMake 引入了各种外部库。为了全面披露,应该知道我对 C、C++ 和 CMake 还很陌生,因此请善待。

我在 OS X Yosemite 10.10.4 中工作(我的谷歌搜索似乎表明这可能是问题的一部分)。我正在使用 CLion IDE。

唉,我们开始吧,这是我正在尝试构建的程序:

#include <iostream>
#include "Simbody.h" \\Written in C++
extern "C"
{
    #include "project_in_C.h"
}

using namespace std;
using namespace SimTK;

int main(int argc, char** argv) {
    cout << "Hello, World!" << endl;
    return 0;
}

我们有一个用C++ 编写的物理库,一个用C 编写的定制项目,它的主头文件是,我们称之为; project_in_C.h.

再次;我要做的就是构建一个简单的混合C/C++ 项目。

现在,上面是使用 CMake 执行的,下面是 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.2)
project(HelloTest)

# Simbody
find_package(Simbody REQUIRED)
include_directories(${Simbody_INCLUDE_DIR})
link_directories(${Simbody_LIB_DIR})

# Project C Headers
set(PROJC_ROOT_DIR "/Users/usr/project-c")
set(PROJC_INCLUDE_DIR ${PROJC_ROOT_DIR}/src
                      ${PROJC_ROOT_DIR}/dir1
                      ${PROJC_ROOT_DIR}/dir2)
include_directories(${PROJC_INCLUDE_DIR})

# Check that it has found the most important header
find_path(projFound project_in_C.h PATHS "/Users/usr/project-c/src")
if(NOT projFound)
  message(FATAL_ERROR "Cannot find folder containing project_in_C.h")
endif()

# Project C Source [we want to avoid globbing]
set(PROJC_SOURCE ${PROJC_ROOT_DIR}/src/file1.c
                 ${PROJC_ROOT_DIR}/src/file2.c
                 ${PROJC_ROOT_DIR}/src/file3.c
                 ${PROJC_ROOT_DIR}/src/file4.c
                 ${PROJC_ROOT_DIR}/dir1/file5.c)
# Make library from source files
add_library(PROJC_LIBRARIES ${PROJC_SOURCE})

# Tie together
set(SOURCE_FILES main.cpp)
add_executable(HelloTest ${SOURCE_FILES})
target_link_libraries(HelloTest ${Simbody_LIBRARIES} ${PROJC_LIBRARIES})

到目前为止一切顺利,但真正神秘的问题出现在这里。在构建时,这是我得到的回报:

/Applications/CLion.app/Contents/bin/cmake/bin/cmake --build /Users/usr/Library/Caches/clion10/cmake/generated/c1d0f54d/c1d0f54d/Debug --target all -- -j 2
Scanning dependencies of target HelloTest
[ 91%] Built target PROJC_LIBRARIES
[100%] Building CXX object CMakeFiles/HelloTest.dir/main.cpp.o
Linking CXX executable HelloTest
Undefined symbols for architecture x86_64:
  "_program_execution_wrapper", 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[2]: *** [HelloTest] Error 1
make[1]: *** [CMakeFiles/HelloTest.dir/all] Error 2
make: *** [all] Error 2

但这到底是什么意思?

它正在与project_in_C.h 大惊小怪,错误似乎所指的部分是这样写的:

int program_execution_wrapper(int argc, char **argv);

int __program(int argc, char **argv);
#define main main(int argc, char **argv) { return program_execution_wrapper(argc, argv); } int __program

一如既往,非常感谢任何帮助。

【问题讨论】:

    标签: c++ c xcode linker cmake


    【解决方案1】:

    Em...未定义的符号是_program_execution_wrapper ...我在您的程序中的任何地方都看不到这个符号。这可能是您帖子中的错字吗?如果您将project_in_C.h 中的代码从prog_exec_wrapper 更改为program_execution_wrapper 会怎样?而且,此功能未在您的代码中实现。首先尝试这样的事情:

    int program_execution_wrapper(int argc, char **argv) { printf("%s", "something"); }
    

    根据您的 cmets 进行编辑: 请参见以下示例: 我们有两个文件(main.cpp)

    #include <iostream>
    
    int sum(int a, int b);
    
    int main()
    {
        int a = sum(3, 5);
        std::cout << a << std::endl;
        return 0;
    }
    

    和文件 sum.cpp

    #include <iostream>
    
    int sum(int a, int b)
    {
        return a+b;
    }
    

    所以我想编译这个程序......它会是这样的

    g++ main.cpp
    

    我收到以下错误:

    Undefined symbols for architecture x86_64:
      "sum(int, int)", referenced from:
          _main in main-22f955.o
    ld: symbol(s) not found for architecture x86_64
    

    但是如果我在我的主程序中包含 sum.cpp,那么程序就会像魅力一样工作。

    【讨论】:

    • 正如我所说,program_execution_wrapper 只是声明但未定义。您使用函数体({ } 中的代码)定义它。请参阅我的答案中的代码。更准确地说,我的答案中的函数 program_execution_wrapper 已定义,而您的未定义。
    • 对,这就是我的C/C++ novice-status 真正展示自己的地方...program_execution_wrapper 定义在通过@987654333 在cmake 中加载的其他源文件之一中@。我没有把它们都写出来,因为有很多,我想展示我的问题的一般要点。因此该函数已被声明,但位于不同的源文件中。话虽如此,project_in_C.h 中不包含相应的头文件 - 鉴于我们实际上已经加载了头文件,是否需要让目标“知道”它的位置?
    • 如果函数是在某个静态库中定义的,那么不,你不需要包含定义的cpp文件。否则,您必须包含定义函数的文件
    猜你喜欢
    • 2019-07-20
    • 2017-11-07
    • 2012-05-15
    • 2013-06-23
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2015-04-23
    相关资源
    最近更新 更多