2017-06-18 43 views
0

CMAKEの助けを借りて、いくつかのMSVCプロジェクトをLinuxに移植しようとしています。 ライブラリプロジェクトの1つでは、宣言されていてどこにも定義されていないか、どこでも使用されている関数がいくつかあります。 EX用 :私は、Linuxで作るのですかしようとすると、GCC&CMAKEで未使用の未定義参照を解決する方法

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

は今、私は宣言された関数に未定義の参照を観察しています。同じコードが同じCMAKEファイルでMSVCで動作します。

私は自分の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

申し訳ありません、私は 'make VERBOSE = 1'を意味しました。あなたの 'CMakeLists.txt'の内容は、次の点を除いて妥当なものです:1. * GCC_COVERAGE_LINK_FLAGS *変数**を2回**に設定して、2番目の割り当てが最初のものを上書きするようにします。 2.最初の割り当てでは、値の先頭にダッシュを追加する必要があります: '--unresolved-symbols = ...'。 – Tsyvarev

答えて

2

ためのcmakeのファイルです。

リンカエラーは、シンボルがどこで使用されているかを示すはずです。

編集:改訂された質問

これは別のセクションに各機能を置くようにコンパイラを尋ねることで回避することができますので、彼らは最終的なリンクまでのオブジェクトファイル内で離れて保持され、その後、指示リンカーは、参照されていないセクションを破棄します。

は適宜CFLAGSおよび/またはCXXFLAGS-ffunction-sectionsを追加し、-Wl,--gc-sectionsLDFLAGSへ。

リンクタイムオプティマイザ(-flto)でもこれを行うことができますが、AFAIKでは最適化を有効にする必要があるため、デバッグビルドでは失敗します。

+0

私は正しく質問しなかったと思いますが、修正しました。関数は参照されますが、呼び出し関数は使用されません。 – Rama

+0

コンパイラ、リンカのフラグを試してみました。しかし、私はまだエラーが表示されます。 -fltoでも動作していないようです。 – Rama

0

プロジェクトの関数の実装がない場合は、別のライブラリに実装する必要があります。あなたのビジュアルスタジオプロジェクトで、プロジェクトを右クリックし、 "Properties"を選択し、 "Linker"の下でリンクされたライブラリとリンクディレクトリを見てください。そこには少なくとも1つのライブラリが定義されています。その後、CMAKEでは、同じlibにtarget_link_librariesが必要です。