上記のように、いくつかのダイナミックライブラリ(.so)を使用するc ++プロジェクト(CMakeを使用)のコンパイルに問題があります。私のディレクトリには3つのライブラリがあります(つまり、home/sources/lib/
)。コンパイラー(CMakeファイル内)に最初のライブラリ(foo1.so
)を使用するように指示するだけで、機能します(このファイルのみ、順序は関係ありません)。ただし、他のライブラリ(foo2.so
およびfoo2.so
)では機能しません。 3つのファイルすべてに.so拡張子が付いています。
注:ディレクトリ名とファイル名は変更されましたが、構造は同じです。私が使用しているライブラリは、私がコンパイル/作成したものではなく、サードパーティのものです。 (いつ壊れたのかは関係ありませんよね?)
そしてこれは私のCMakeファイルがどのように見えるかです:
cmake_minimum_required(VERSION 3.3)
project(MyProj)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -m64")
INCLUDE_DIRECTORIES("/home/sources/include")
LINK_DIRECTORIES("/home/sources/lib")
set(SOURCE_FILES main.cpp)
add_executable(MyProj ${SOURCE_FILES})
TARGET_LINK_LIBRARIES(MyProj foo1.so)
上記の行をこれに変更しても機能しなくなります。
TARGET_LINK_LIBRARIES(MyProj foo1.so foo2.so foo3.so)
それを書くためのちょうど別の方法(助けにはなりません)
TARGET_LINK_LIBRARIES(MyProj foo1.so)
TARGET_LINK_LIBRARIES(MyProj foo2.so)
TARGET_LINK_LIBRARIES(MyProj foo3.so)
そして、上記のように:3つのライブラリはすべて同じディレクトリにあります(私はLINK_DIRECTORIES
で参照します)
そして、これは他のライブラリでコンパイルしようとしたときに私が得るエラーです(foo1.so
だけが機能すると言ったように):
[ 50%] Linking CXX executable MyProj
/usr/bin/ld: cannot find -lfoo2
/usr/bin/ld: cannot find -lfoo3
collect2: error: ld returned 1 exit status
make[3]: *** [MyProj] Error 1
make[2]: *** [CMakeFiles/MyProj.dir/all] Error 2
make[1]: *** [CMakeFiles/MyProj.dir/rule] Error 2
make: *** [MyProj] Error 2
追伸:ここに投稿する前に調査を行いましたが、この「奇妙な」問題を抱えている人は他に見つかりませんでした。そして確かに、グーグルのスキルがなければ、CMakeファイルを持って来ることはできなかったでしょう^^
確かではありませんが、CMakeはlibfoo1.so
を探しているようですが、ファイルは実際にはfoo1.so
です(同じことがfoo2
とfoo3
にも当てはまります)
"importing" ライブラリを試してください:
add_library(foo1 SHARED IMPORTED)
set_property(TARGET foo1 PROPERTY IMPORTED_LOCATION "/home/sources/lib/libfoo1.so")
# same thing for foo2 and foo3 ...
target_link_libraries(MyProj foo1 foo2 foo3)
[〜#〜]編集[〜#〜]
ライブラリへのフルパスを提供する可能性もあります。
target_link_libraries(MyProj "/home/sources/lib/libfoo1.so"
"/home/sources/lib/libfoo2.so"
"/home/sources/lib/libfoo3.so")