2017-06-18 99 views
0

我想借助CMAKE將一些MSVC項目移植到Linux。 在其中一個庫項目中,有一些函數只是聲明的,並沒有在任何地方定義或在任何地方使用。 爲前:如何解決未定義的引用時,他們不使用GCC和CMAKE

int fun_a(); 
    int fun_unsed() /*This function is never used in project*/ 
    { 
     fun_a(); 
    } 

現在,當我嘗試做製作在Linux中,我觀察未定義參考聲明的函數。但是相同的代碼在MSVC上使用相同的CMAKE文件。

我試圖在我的CMAKE文件中使用下面的標誌(來自here),但似乎沒有幫助。

SET(GCC_COVERAGE_COMPILE_FLAGS 「-unresolved符號=忽略所有」) SET(GCC_COVERAGE_LINK_FLAGS 「-unresolved符號=忽略所有」)

SET(CMAKE_CXX_FLAGS 「$ {CMAKE_CXX_FLAGS} $ {GCC_COVERAGE_COMPILE_FLAGS}」 ) SET(CMAKE_EXE_LINKER_FLAGS「$ {CMAKE_EXE_LINKER_FLAGS} $ {GCC_COVERAGE_LINK_FLAGS}」)

我錯過了什麼?

下面是可執行

#Add Library Projects to the test application 
add_subdirectory ("${PROJECT_BINARY_DIR}/../../src/build/vc/" "${PROJECT_BINARY_DIR}/../../src/build/vc/") 


#set additional search paths for libraries 
#set(CMAKE_LIBRARY_PATH ${PROJECT_BINARY_DIR}/../../lib/Debug) 
    link_directories(${PROJECT_BINARY_DIR}/../../lib ${OPENCV_BUILD}/lib) 
    #set ignore undefined & unused functions errors. It seems GCC by defalt looks for them. 
    SET(GCC_COVERAGE_LINK_FLAGS "-unresolved-symbols=ignore-all") 
    SET(GCC_COVERAGE_COMPILE_FLAGS "-ffunction-sections") 
    SET(GCC_COVERAGE_LINK_FLAGS "-Wl,-gc-sections -flto") 


    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}") 
    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}") 

#Get the exicutable for source files 
add_executable (FaceAnalysis ${sources}) 
    target_link_libraries (FaceAnalysis faceDetect.a libopencv_core.so libopencv_imgproc.so libopencv_imgcodecs.so libopencv_videoio.so libopencv_objdetect.so libopencv_highgui.so libopencv_video.so libopencv_ml.so SDL2) 

add_dependencies(FaceAnalysis faceDetect) 
+0

顯示精確的'CMakeLists.txt'。有一些關於設置* CMAKE_CXX_FLAGS *的具體內容。另外,運行構建過程'make V = 1',使用該選項,您可以看到用於編譯和鏈接的完整命令行。 – Tsyvarev

+1

@Tsyvarev添加了CMakeLists.txt文件,使V = 1不提供任何額外的信息 – Rama

+0

對不起,我的意思是'使VERBOSE = 1'。你的'CMakeLists.txt'的內容看起來很合理,除了:1.你設置了* GCC_COVERAGE_LINK_FLAGS *變量**兩次**,所以第二個任務將覆蓋第一個。 2.在第一次賦值時,它應該是值的開始處的附加短劃線:'--unresolved-symbols = ...'。 – Tsyvarev

回答

2

cmake的文件如果他們確實是未引用的,你不會得到一個「未定義的引用」錯誤。

鏈接器錯誤應該告訴你符號在哪裏使用。

編輯:修訂後的問題

這可以圍繞通過要求編譯器將每個函數到單獨的部分進行加工,所以他們保持分開的目標文件中,直到最後一個環節,然後指示鏈接器丟棄未被引用的部分。

-ffunction-sections加到CFLAGS和/或CXXFLAGS-Wl,--gc-sectionsLDFLAGS

鏈接時間優化程序(-flto)也可以這樣做,但AFAIK需要優化才能啓用,所以它在調試版本中會失敗。

+0

我想我沒有正確提問,我糾正了它。該函數被引用,但不使用調用函數。 – Rama

+0

嘗試提到編譯器,鏈接器的標誌。但我仍然看到錯誤。即使-flto也似乎不起作用。 – Rama

0

如果您的項目中沒有該功能的實現,那麼它必須在另一個庫中實現。在Visual Studio項目中,右鍵單擊項目,選擇「屬性」,然後在「鏈接器」下查看鏈接庫和鏈接目錄。你會在那裏看到至少一個庫。然後在CMAKE中,您只需要target_link_libraries即可。

相關問題