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

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

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

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

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

C++

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

Q&A

解決済

3回答

20237閲覧

「LNK2001 外部シンボル xxx 未解決です」のエラーが解消できない。

moti7

総合スコア15

C

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

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

C++

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

0グッド

0クリップ

投稿2021/08/09 03:09

課題

「LNK2001 外部シンボル xxx 未解決です」のエラーが解消できない。

目的

プロジェクト(ConsoleApplication2)で作成した関数を、別プロジェクト(ConsoleApplication3)で使用したい

やったこと

・上記目的達成のために、
プロジェクト(ConsoleApplication2)を作成し、関数を追加して。
別プロジェクト(ConsoleApplication3)で参照を追加し、コンパイルをしました。

・エラーについて、調査したところ、コンパイルは通っているが、リンクで失敗しているエラーであり、関数宣言しているが、実体がないためにでるエラーのようです。ソースを確認すると、宣言もあり、実体もあります。
そのため、ほかに、visual studioでプロジェクトの設定が足りないのではないかと考えていますが、調べても何が足りないのかわかりません。

環境

・visual studio 2019

エラー内容

LNK2001 外部シンボル readIni2 は未解決です

設定

・以下添付ファイルのように、プロジェクトの参照を追加しています。

イメージ説明

ソース

プロジェクト(ヘッダー)名:ConsoleApplication2

C

1#pragma once 2 3#define CONFIG_FILE_NAME ".\config.ini" 4#define DEBUG_CONFIG_FILE_NAME "C:\test\testConfig.ini" 5#define SECTION_NAME_DATABASE "database" 6#define KEY_NAME_HOST "host" 7#define KEY_NAME_PORT "port" 8#define KEY_NAME_NAME "name" 9#define KEY_NAME_USER "user" 10#define KEY_NAME_PASS "pass" 11#define KEY_NAME_DIR "dir" 12#define READ_SIZE (256) 13 14extern "C" { 15 bool readIni2(); 16}

プロジェクト(ソース)名:ConsoleApplication2

C

1#include "test.h" 2#include <windows.h> 3#include <stdio.h> 4 5// ------------------------------- 6// 関数名:configファイル読み込み 7// ------------------------------- 8bool readIni2() { 9 TCHAR sc_buf[READ_SIZE]; 10 11 DWORD ret; 12 ret = GetPrivateProfileString(TEXT(SECTION_NAME_DATABASE), TEXT(KEY_NAME_HOST), TEXT(""), sc_buf, (READ_SIZE - 1), TEXT(DEBUG_CONFIG_FILE_NAME)); 13 14 printf("読み込み結果: %d\n", ret); 15 printf("読み込み結果: %ls\n", sc_buf); 16 17 ret = GetPrivateProfileString(TEXT(SECTION_NAME_DATABASE), TEXT(KEY_NAME_PORT), TEXT(""), sc_buf, (READ_SIZE - 1), TEXT(DEBUG_CONFIG_FILE_NAME)); 18 printf("読み込み結果: %ls\n", sc_buf); 19 20 ret = GetPrivateProfileString(TEXT(SECTION_NAME_DATABASE), TEXT(KEY_NAME_NAME), TEXT(""), sc_buf, (READ_SIZE - 1), TEXT(DEBUG_CONFIG_FILE_NAME)); 21 printf("読み込み結果: %ls\n", sc_buf); 22 23 ret = GetPrivateProfileString(TEXT(SECTION_NAME_DATABASE), TEXT(KEY_NAME_USER), TEXT(""), sc_buf, (READ_SIZE - 1), TEXT(DEBUG_CONFIG_FILE_NAME)); 24 printf("読み込み結果: %ls\n", sc_buf); 25 26 ret = GetPrivateProfileString(TEXT(SECTION_NAME_DATABASE), TEXT(KEY_NAME_PASS), TEXT(""), sc_buf, (READ_SIZE - 1), TEXT(DEBUG_CONFIG_FILE_NAME)); 27 printf("読み込み結果: %ls\n", sc_buf); 28 29 ret = GetPrivateProfileString(TEXT(SECTION_NAME_DATABASE), TEXT(KEY_NAME_DIR), TEXT(""), sc_buf, (READ_SIZE - 1), TEXT(DEBUG_CONFIG_FILE_NAME)); 30 printf("読み込み結果: %ls\n", sc_buf); 31 32 33 return true; 34}

プロジェクト(ソース)名:ConsoleApplication3

C++

1#include <iostream> 2 3#include "../ConsoleApplication2/test.h" 4 5int main() 6{ 7 std::cout << "Hello World!\n"; 8 9 readIni2(); 10}

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

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

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

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

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

guest

回答3

0

プロジェクトの名前が「ConsoleApplication2」ということは、もとはコンソールアプリ用として作成したプロジェクトでしょうか。
そこから設定を修正していないのであれば、プロジェクトのプロパティで、「構成プロパティ」「全般」「構成の種類」が「アプリケーション(.exe)」になっていないでしょうか。
それを「スタティック ライブラリ(.lib)」に変えたうえで、ConsoleApplication2側のmain関数の定義を削除したらどうなるでしょうか。

投稿2021/08/09 09:57

actorbug

総合スコア2359

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

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

moti7

2021/08/09 10:25

回答ありがとうございます。 他でも、ライブラリ化すべきと、指摘を受け、 ConsoleApplication2をスタティックライブラリで作り直した結果、 目的を達成することができました。
guest

0

ConsoleApplication2.cpp

#include "../ConsoleApplication2/test.h"

が書いて無いので、普通に C++ の関数名生成規則の名前になってるんじゃないでしょうか?

投稿2021/08/09 05:12

編集2021/08/09 05:34
PingHermit

総合スコア478

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

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

episteme

2021/08/09 06:05

#include "test.h" してるから、ソコは無問題ちゃうかな...
moti7

2021/08/09 10:27

回答ありがとうございます。 はい。epistemeさんの指摘の通りです。
PingHermit

2021/08/09 11:33

そうですね。 勘違いしてました。(^^;
guest

0

ベストアンサー

ConsoleApplication2/test.cpp あるいは ConsoleApplication2/test.obj をプロジェクトに含めにゃならんように思います。

投稿2021/08/09 03:17

episteme

総合スコア16612

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

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

moti7

2021/08/09 03:27

回答ありがとうございます。 ConsoleApplication2/test.cppをConsoleApplication3に含めると、エラーは解消されます。 ただし、今回やりたい目的とは、異なるため、含めていません。 上記、目的のために、別プロジェクトを参照で追加する方法をとっています。 (同じソースを別々のプロジェクトでもつのは、メンテナンスがよくないと考えているため、同じソースは、共有したいです。)
episteme

2021/08/09 03:29

各アプリで使われる関数群をまとめたライブラリ・プロジェクトを作り、そのライブラリを ConsoleApplication2/ConsoleApplication3でリンクしては?
moti7

2021/08/09 10:23

返信ありがとうございます。 ライブラリでプロジェクトを作成する案、勉強になります。 確かにライブラリ化したほうがよいですね。 ライブラリ化しなくても、別プロジェクトの関数をヘッダーで読み込んで関数コールできればと思っていました。 素直に、ライブラリ化しました。 ConsoleApplication2をスタティックライブラリ化して、作り直した結果、問題が解決しました。 ありがとうございました。
episteme

2021/08/09 10:33 編集

> ライブラリ化しなくても、別プロジェクトの関数をヘッダーで読み込んで関数コールできればと思っていました。 それを目論むなら(#includeだけで使える)ヘッダonlyライブラリに仕立てんとなりません。 templateとinlineで実装(定義)せんならんです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問