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

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

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

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

C++

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

Q&A

解決済

1回答

1688閲覧

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

FoolHotari

総合スコア79

CMake

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

C++

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

0グッド

0クリップ

投稿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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

総合スコア79

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問