質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

解決済

共有ライブラリをリンクできない

FoolHotari
FoolHotari

総合スコア78

CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1回答

0グッド

0クリップ

265閲覧

投稿2022/11/03 05:19

前提

CMakeでビルドしようとしています。
ある実行ファイルに同一プロジェクト内の共有ライブラリをリンクさせようとしたところリンカエラーが発生しました。

実現したいこと

  • 実行ファイルに共有ライブラリをリンクする

発生している問題・エラーメッセージ

以下はCMakeの出力です。

[main] Building folder: CMake-Shared [build] Starting build [proc] Executing command: "C:\Program Files\CMake\bin\cmake.EXE" --build d:/dev/Cpp/CMake/CMake-Shared/build --config Debug --target all -- [build] [1/3 33% :: 0.319] Building CXX object CMakeFiles/Lib.dir/Lib/src/hello.cc.obj [build] [2/3 66% :: 0.408] Linking CXX shared library Lib.dll [build] [3/3 100% :: 0.476] Linking CXX executable Main.exe [build] FAILED: Main.exe [build] cmd.exe /C "cd . && C:\PROGRA~1\LLVM\bin\CLANG_~1.EXE -fuse-ld=lld-link -nostartfiles -nostdlib -g -Xclang -gcodeview -O0 -D_DEBUG -D_DLL -D_MT -Xclang --dependent-lib=msvcrtd -Xlinker /subsystem:console CMakeFiles/Main.dir/Main/src/main.cc.obj -o Main.exe -Xlinker /MANIFEST:EMBED -Xlinker /implib:Main.lib -Xlinker /pdb:Main.pdb -Xlinker /version:0.0 Lib.lib -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 -loldnames && cd ." [build] lld-link: error: undefined symbol: public: __cdecl Hello::Hello(class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>>) [build] >>> referenced by D:\dev\Cpp\CMake\CMake-Shared\Main\src\main.cc:8 [build] >>> CMakeFiles/Main.dir/Main/src/main.cc.obj:(main) [build] [build] lld-link: error: undefined symbol: public: class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>> __cdecl Hello::Say(class std::basic_string<char, struct std::char_traits<char>, class std::allocator<char>>) [build] >>> referenced by D:\dev\Cpp\CMake\CMake-Shared\Main\src\main.cc:9 [build] >>> CMakeFiles/Main.dir/Main/src/main.cc.obj:(main) [build] clang++: error: linker command failed with exit code 1 (use -v to see invocation) [build] ninja: build stopped: subcommand failed. [proc] The command: "C:\Program Files\CMake\bin\cmake.EXE" --build d:/dev/Cpp/CMake/CMake-Shared/build --config Debug --target all -- exited with code: 1 and signal: null [build] Build finished with exit code 1

該当のソースコード

PowerShell

1PS D:\dev\Cpp\CMake\CMake-Shared> tree /f 2D:. 3│ CMakeLists.txt 45├─Lib 6│ ├─include 7│ │ hello.h 8│ │ 9│ └─src 10│ hello.cc 1112└─Main 13 └─src 14 main.cc

CMake

1# ./CMakeLists.txt 2 3cmake_minimum_required(VERSION 3.13) 4project(sample CXX) 5 6add_library(Lib SHARED 7 ${CMAKE_CURRENT_SOURCE_DIR}/Lib/src/hello.cc 8) 9target_include_directories(Lib INTERFACE 10 ${CMAKE_CURRENT_SOURCE_DIR}/Lib/include 11) 12 13add_executable(Main 14 ${CMAKE_CURRENT_SOURCE_DIR}/Main/src/main.cc 15) 16 17target_link_libraries(Main Lib) 18# target_link_directories(Main PUBLIC $<TARGET_FILE:Lib>) 19# target_link_directories(Main PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/build/Lib)

C++

1// ./Lib/include/hello.h 2 3#ifndef __HELLO_H__ 4#define __HELLO_H__ 5 6#include <string> 7 8class Hello { 9private: 10 std::string name; 11 12public: 13 Hello(std::string name); 14 15 std::string Say(std::string message); 16}; 17 18#endif // __HELLO_H__

C++

1// ./Lib/src/hello.cc 2 3#include "../include/hello.h" 4 5Hello::Hello(std::string name) { 6 this->name = name; 7} 8 9std::string Hello::Say(std::string message) { 10 return message + ", " + name + '.'; 11}

C++

1// ./Main/src/main.cc 2 3#include <iostream> 4 5#include "hello.h" 6 7using namespace std; 8 9int main() { 10 Hello hello("John"); 11 cout << hello.Say("Hi") << endl; 12}

試したこと

target_link_directoriesを使いましたが変わりませんでした。

add_libraryのSHAREDをSTATICに変えるとリンクできます。

main.ccの#includeで相対パスを使いましたが変わりませんでした。

補足情報(FW/ツールのバージョンなど)

PowerShell

1PS D:\dev\Cpp\CMake\CMake-Shared> wmic os get caption 2Caption 3Microsoft Windows 11 Home 4 5PS D:\dev\Cpp\CMake\CMake-Shared> wmic os get osarchitecture 6OSArchitecture 764 ビット 8 9PS D:\dev\Cpp\CMake\CMake-Shared> cmake --version 10cmake version 3.24.2 11 12CMake suite maintained and supported by Kitware (kitware.com/cmake). 13PS D:\dev\Cpp\CMake\CMake-Shared> ninja --version 141.11.1 15PS D:\dev\Cpp\CMake\CMake-Shared> clang++ -v 16clang version 15.0.2 17Target: x86_64-pc-windows-msvc 18Thread model: posix 19InstalledDir: C:\Program Files\LLVM\bin 20PS D:\dev\Cpp\CMake\CMake-Shared> code -v 211.73.0 228fa188b2b301d36553cbc9ce1b0a146ccb93351f 23x64

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

自己解決

stackoverflowでも同様の質問をし、回答を得て解決しました。

具体的には以下のように修正しました。

# ./CMakeLists.txt cmake_minimum_required(VERSION 3.13) project(sample CXX) include(GenerateExportHeader) add_library(Lib SHARED ${CMAKE_CURRENT_SOURCE_DIR}/Lib/src/hello.cc ) target_include_directories(Lib INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/Lib/include ) generate_export_header(Lib) file(COPY ${CMAKE_CURRENT_BINARY_DIR}/lib_export.h DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/Lib/include) add_executable(Main ${CMAKE_CURRENT_SOURCE_DIR}/Main/src/main.cc ) target_link_libraries(Main Lib)
// ./Lib/include/hello.h #ifndef __HELLO_H__ #define __HELLO_H__ #include <string> #include "lib_export.h" class LIB_EXPORT Hello { private: std::string name; public: Hello(std::string name); std::string Say(std::string message); }; #endif // __HELLO_H__

投稿2022/11/05 11:38

FoolHotari

総合スコア78

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

CMake

CMakeはクロスプラットフォームで作動するオープンソースのビルドシステムです。コマンドライン又は組み込まれた開発環境で使うことができる元のmakefileとプロジェクトファイルを生成します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。