2014-11-14 94 views
3

當我嘗試編譯時,再次遇到「架構x86_64的未定義符號」錯誤。我已經嘗試了超過我在這篇文章中實際記錄的內容(因爲我已經忘記了我所嘗試過的所有內容)。這是一個非常簡單的設置和應該很容易與CMake編譯...CMake在include_directories中找不到合適的頭文件/包含文件

當我在這上運行一個作品就好了。但我想將它轉換爲CMake以實現互操作性。正如你所看到的,我已經在幾個地方拋出了我的「$ {HEADERS}」變量,我嘗試了很多地方,但是我一直在收到我的錯誤。根據我放置$ {HEADER}的位置,它也可以在技術上生成「錯誤:無法在生成多個輸出文件時指定-o」的錯誤(如果它在中只有位於target_link_library聲明中,則適用)。

我有2個文件夾:

Root 
    Headers (contains all .h files) 
    Source (contains all .cc/.cpp/.c files) (and also a CMakeLists.txt) 
CMakeLists.txt 

我的根的CMakeLists.txt包含以下內容:

cmake_minimum_required(VERSION 2.8.4) 
project(Framework) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 
add_compile_options("-v") 

add_subdirectory(Source) 

#Variables for making my life easier and adding the headers 
set(H Headers) 
include_directories(${H}) 
set(S Source) 
file(GLOB HEADERS 
#Add any file in the headers dir 
"${H}/*" 
) 

# Create a variable to use for main.cc 
set(MAIN ${S}/main.cc ${HEADERS}) 

# Add the main.cc file and headers 
add_executable(Framework ${MAIN} ${HEADERS}) 

# Add the .cc/.cpp files 
target_link_libraries(Framework ${SOURCE_FILES}) 

我的CMakeLists.txt在我的源目錄中包含以下內容:

file(GLOB SOURCES 
"*.cc" 
"*.cpp" 
) 

add_library(SOURCE_FILES ${SOURCES}) 

我在頭文件中沒有一個,我相信,文檔說明我們不需要。

感謝您的幫助。我看:

回答

4

這裏的主要問題是,你指的是SOURCE_FILES目標,如果它是一個變量。刪除DOLLA r標誌和大括號。

target_link_libraries(Framework SOURCE_FILES) 

它也似乎有點怪異,你調用add_subdirectory後置include_directories,我會感到驚訝,如果是工作。

總的來說,我認爲你讓事情比他們需要的更復雜。以下應該是所有必要的。

頂級的CMakeLists.txt

cmake_minimum_required(VERSION 2.8) 
project(Framework CXX) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wextra -pedantic") 

include_directories(
    ${PROJECT_SOURCE_DIR}/Headers 
) 

add_subdirectory(Source) 

源/的CMakeLists.txt

# Do not use file globing because then CMake is not able to tell whether a file 
# has been deleted or added when rebuilding the project. 
set(HELLO_LIB_SRC 
    hello.cc 
) 
add_library(hello ${HELLO_LIB_SRC}) 

set(MAIN_SRC 
    main.cc 
) 
add_executable(hello_bin ${MAIN_SRC}) 
target_link_libraries(hello_bin hello) 

頁眉/ hello.h

#pragma once 

#include <string> 

namespace nope 
{ 
    std::string hello_there(); 
} 

來源/你好。CC

#include <hello.h> 

namespace nope 
{ 
    std::string hello_there() 
    { 
    return "Well hello there!"; 
    } 
} 

源/ main.cc

#include <hello.h> 
#include <iostream> 

int main() 
{ 
    std::cout << nope::hello_there() << std::endl; 
    return 0; 
} 

不用擔心文件的build文件夾中的位置。這是安裝步驟找出來的。

$ mkdir build && cd build 
$ cmake -DCMAKE_BUILD_TYPE=Debug .. 
$ make 
+0

你先生,一個救生員。我從另一個完全不同的項目中操縱了一箇舊的CMake;這顯然沒有奏效。因此,鏈接庫或添加可執行文件的位置並不重要,只要它存在即可? – lilott8 2014-11-14 21:11:09

+0

我不確定你的意思。當你使用像add_executable/add_library/...這樣的函數時,你可以創建一個目標。你可以依賴這個目標在**之後創建的其他目標或特定目標之前創建的目標。 CMake將確保所有的依賴關係在最後得到滿足,否則會尖叫。 – 2014-11-14 21:45:57