2017-04-07 16 views
0

同様の質問が掲載されていることは承知していますが、私のケースにどのように関連するのか分かりません。私はこの質問の前に、CMakeにはあまりよく知られていないと言っていますので、これは簡単な修正であり、私はそれを見ていないのです!CMakeとncursesでコンパイルできない

私はプロジェクトで協力しています。昨日、チームメイトはncursesライブラリをプロジェクトに追加して、ターミナルGUIを構築しました。 ncursesが追加されて以来、私はプロジェクトをコンパイルできませんでした。しかし、6つのncurses- *パッケージをすべてインストールしたので、自分のマシンで動作するはずです。

私はGitHubリポジトリから最新のバージョンのmasterブランチをプルダウンしました。これは彼のマシン上で完璧にコンパイルされ実行されています。しかし、それは私の上でコンパイルされません。

システム:
Linuxのミント18.1シナモン
CMakeのバージョン3.5.1

私が試したもの:
私はCMakeCache.txtを削除し、
それを再読み込み、私は私の全体にCMakeを削除ディレクトリを作り直してください。

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8) 
project(irc) 

set(SHARED_FLAGS " -Wall -Wextra -Wshadow -Werror -g -D_POSIX_C_SOURCE=200809L -lncurses") 
set(CMAKE_C_FLAGS "-std=c11 ${SHARED_FLAGS}") 
set(CMAKE_CXX_FLAGS "-std=c++11 ${SHARED_FLAGS}") 

include_directories(include) 

add_library(client_core SHARED src/client/irc_client.c) 

add_executable(client src/client/irc_client_gui.c) 
add_executable(server src/server/irc_server.c) 

// SOLUTION - MISSING LINE 
target_link_libraries(client ncurses) 

install(FILES include/irc_client.h DESTINATION include) 
install(FILES include/irc_server.h DESTINATION include) 

CMakeOutput:

CMakeFiles/client.dir/src/client/irc_client_gui.c.o: In function `main': 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:17: 
undefined reference to `initscr' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:18: 
undefined reference to `stdscr' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:18: 
undefined reference to `stdscr' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:18: 
undefined reference to `stdscr' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:18: 
undefined reference to `stdscr' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:19: 
undefined reference to `mvprintw' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:21: 
undefined reference to `stdscr' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:21: 
undefined reference to `wgetnstr' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:22: 
undefined reference to `LINES' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:22: 
undefined reference to `mvprintw' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:23: 
undefined reference to `stdscr' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:23: 
undefined reference to `wgetch' 
/home/chrisjansson/Documents/irc/src/client/irc_client_gui.c:24: 
undefined reference to `endwin' 
collect2: error: ld returned 1 exit status 
CMakeFiles/client.dir/build.make:94: recipe for target 'client' failed 
make[2]: *** [client] Error 1 
CMakeFiles/Makefile2:104: recipe for target 'CMakeFiles/client.dir/all' 
failed 
make[1]: *** [CMakeFiles/client.dir/all] Error 2 
Makefile:127: recipe for target 'all' failed 
make: *** [all] Error 2 

興味深いことに、私はgccで手動でコンパイルして実行し、私のマシン上の他の場所/ペーストirc_client_gui.cをコピーする場合、それは完璧に動作します。だから問題は私のマシンではなく、私のプロジェクト全体をコンパイルしようとするCMakeのものです。何か案は?本当にありがとう!

+1

'問題は私のマシンではなく、CMakeが私のプロジェクト全体をコンパイルしようとするものです。 ' - プロジェクトの' CMakeLists.txt'ファイルの問題ですが、あなたはそれを表示しません。 – Tsyvarev

+0

@Tsyvarevおっと、私はちょうどそれを上に追加しました。ありがとう! –

+1

'make VERBOSE = Y'を実行すると、コンパイラ/リンカの呼び出し方法を正確に見ることができますか?あなたが 'target_link_libraries'のようなものを使わなかったので、' -lncurses'がリンカのステップで渡されていないことを強く疑っています。定義されていない参照エラーは、リンク時に '-l'引数が見つからないことが原因です。 –

答えて

1

ソリューションは、このような行を追加することです:

target_link_libraries(client ncurses) 

これはclientターゲットをリンクされている場合、それはncursesライブラリにリンクする-lncursesオプションを使用する必要があることにCMakeを伝えます。

関連する問題