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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

Q&A

解決済

2回答

377閲覧

同じソリューション内の別プロジェクトの関数を使用する方法

zenryokusyounen

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

0グッド

0クリップ

投稿2025/01/23 15:14

実現したいこと

同じソリューション内の別プロジェクトの関数を使用する方法

発生している問題・分からないこと

SampleProject内にあるCalcファイルに定義してあるsum関数を
別プロジェクト(Test)で呼び出してみたのですが、calc.hをインクルードするとビルドエラーが発生
calc.cppをインクルードするとビルドが通り動きます。
ヘッダーファイルを呼び出しでビルドエラーになって、ソースファイルを呼び出してビルドが通るのが気持ち悪いので、原因を知りたいです。
■ビルド成功画像
イメージ説明
■ビルド失敗画像
イメージ説明

エラーメッセージ

error

1重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 詳細 2エラー LNK2019 未解決の外部シンボル "int __cdecl sum(int,int)" (?sum@@YAHHH@Z) が関数 main で参照されました Test C:\Users\tomoy\Documents\Visual Studio 2022\Project\SampleProject\Test\Test.obj 1 3 4重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 詳細 5エラー LNK1120 1 件の未解決の外部参照 Test C:\Users\tomoy\Documents\Visual Studio 2022\Project\SampleProject\x64\Debug\Test.exe 1 6

該当のソースコード

Calc.cpp

1#include "Calc.h" 2 3int sum(int a, int b) 4{ 5 return a + b; 6} 7

Calc.h

1#pragma once 2 3int sum(int a, int b);

Test.cpp

1#include <iostream> 2#include "Calc.h" 3 4int main() 5{ 6 std::cout << "Hello World!\n"; 7 std::cout << sum(5, 5); 8}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

解決できるような情報は見つけられませんでした。

補足

特になし

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

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

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

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

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

jimbe

2025/01/23 15:36

とりあえず、 c と c++ は違う言語ですので c のタグは外してください。
jimbe

2025/01/23 15:41

cpp を読ませれば使えるのであれば、 Test に Calc がリンクされていないのではないでしょうか。
fana

2025/01/24 01:54

その SampleProject は何のプロジェクトなのでしょう? (SampleProject をビルドした結果として何ができる? exe? lib? その他?) それ次第で話が異なるのではないか,という気がします.
dodox86

2025/01/24 02:54

> calc.cppをインクルードするとビルドが通り動きます。 > ヘッダーファイルを呼び出しでビルドエラーになって、ソースファイルを呼び出してビルドが通るのが気持ち悪いので、原因を知りたいです。 恐らくなんですが、質問者さんはソースファイルをコンパイルするとオブジェクトファイル(*.obj)ができ、それらのオブジェクトファイルをリンクして実行ファイル(*.exeとか*.dll)が できる。それら一連の過程がビルド、ということをまだご存じないかピンと来ていないのかと思います。 #includeでソースファイルを呼び出す、と言うのはちょっと変で、#includeでその位置に指定のファイルを取り込むだけです。(言い方だけの問題ですけど) ソリューションとプロジェクトの関係を何となくでも理解してからいただいた回答を読むと良いかもしれませんね。 https://learn.microsoft.com/ja-jp/cpp/ide/walkthrough-working-with-projects-and-solutions-cpp?view=msvc-170
guest

回答2

0

calc.hをインクルードするとビルドエラーが発生
calc.cppをインクルードするとビルドが通り動きます。
ヘッダーファイルを呼び出しでビルドエラーになって、ソースファイルを呼び出してビルドが通るのが気持ち悪いので、原因を知りたいです。

とりあえずこれに関しては,
#include "XXX" というのは,『この場所に "XXX" ファイルの内容を丸ごと挿入』ということだから→そうなる」という話でしょう.
(プロジェクトが別だという要素はとりあえず全く無関係.とにかく指定されたファイルの中身をそこに入れる)

"Calc.h" をincludeした場合,その結果は

C

1#include <iostream> 2 3//#include "Calc.h" → Calc.h の中身がここに挿入された 4int sum(int a, int b); 5 6int main() 7{ 8 std::cout << "Hello World!\n"; 9 std::cout << sum(5, 5); 10}

という形になるわけで,main で使おうとしている関数 sum の定義がどこにも無いのでコンパイルエラーになります.
※注: "Calc.h" 内の記述 #pragma once を意図的に無視した形で書いています.
(こいつに関しては気になるなら別途調べてください.ここでは話を簡単にするために無視.)

”Calc.cpp" を include した場合だと

C

1#include <iostream> 2 3//#include "Calc.cpp" → Calc.cpp の中身がここに挿入された 4//で,Calc.cpp の中には #include "Calc.h" があったので,ここに Calc.h の中身が挿入された 5int sum(int a, int b); 6 7int sum(int a, int b) 8{ 9 return a + b; 10} 11 12int main() 13{ 14 std::cout << "Hello World!\n"; 15 std::cout << sum(5, 5); 16}

となり,この場合,関数 sum の定義があるのでコンパイルが通った,と.

投稿2025/01/24 02:15

編集2025/01/24 02:22
fana

総合スコア12079

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

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

0

ベストアンサー

clac.hに関数の実装が定義されていないためエラーが発生します
関数の定義と実装を分けたい場合はソースコードのリンク時にファイルを指定します

cl Test.cpp clac.cpp link Test.obj clac.obj link Test.obj clac.lib . .

VidualStudioであれば追加のライブラリディレクトリという設定項目があります
一度ビルドを通したならばclac.objというオブジェクトファイルがあるはずなので、そのディレクトリを指定します
今回であれば、カレントディレクトリ.を指定します

投稿2025/01/23 23:25

編集2025/01/24 05:28
Manabu

総合スコア93

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

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

zenryokusyounen

2025/01/25 02:18

回答ありがとうございます。 試したところ問題が解決しました! ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.33%

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

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

質問する

関連した質問