スタティックライブラリーの作成について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Bone
記事: 7
登録日時: 11年前

スタティックライブラリーの作成について

#1

投稿記事 by Bone » 10年前

VisualStadio2010でのスタティックライブラリの作り方がわかりません
いくらか検索して
作成時にスタティックライブラリにチェックをいれ、プリコンパイル済みからチェックは外し、一通りの作業はやりました
サイトは下記のサイトを参考にしています
http://d.hatena.ne.jp/mitsu_chie/touch/ ... 1236324630

このあと別プロジェクトより、プロパティより追加インクルードを行い、ライブラリと同じディレクトリにあるヘッダーファイルを読み込んで使用したところ、ライブラリの重複などのエラーが発生しました。
ライブラリとヘッダーファイルは上記の通り同じディレクトリにあり、Libというディレクトリに統括しています。
それらをVisualStadioのプロパティから追加インクルードディレクトリに指定しています
目標としては、公開できるようにできたらと思っているのですが、ここでつまってしまっています。
もしよろしければ、正しいやり方を教えてください
よろしくお願いいたします
ただいまコードが手元にないため、戻り次第、のせさせていただきます

アバター
Ketty
記事: 103
登録日時: 11年前

Re: スタティックライブラリーの作成について

#2

投稿記事 by Ketty » 10年前

Visual Studioにおけるlibファイルの作成~参照については、
過去に私が同じ質問をあげていますのでよかったらどうぞ(^^)

http://dixq.net/forum/viewtopic.php?f=3&t=15689
ライブラリの重複などのエラーが発生しました。
なんとなく参照側に問題がありそうだなぁと想像はできますが、
一度、私のように(上記トピックのように)、ごくごく簡単なlibを作って実験してみられてはいかがでしょう。

簡単なlibでも同じ結果になるorならないを明確にされれば、
Boneさんの問題が以下のどこにあるかわかりやすいと思います。
・lib側のソース
・lib作成の手順
・参照する側のソース
・参照の手順

Bone
記事: 7
登録日時: 11年前

Re: スタティックライブラリーの作成について

#3

投稿記事 by Bone » 10年前

返信送れて申し訳有りません
ただいま、すこし多忙で、質問に必要なプログラムをかけていません
明日、夜には、暇が出来ますので、もう少し返信を待っていただくと幸いです。
空き時間に、Ketty様が立てたトピックのほうを見せていただきましたので、それを参考に明日立ててみます。
エラー、または概念の理解が出来なかった場合は、また質問させていただきますので、よろしくお願いいたします。

Bone
記事: 7
登録日時: 11年前

Re: スタティックライブラリーの作成について

#4

投稿記事 by Bone » 10年前

先ほど実験し、コンパイルと引き出すことが出来るようにはなりました。
ありがとうございました

コード:

//TestLib.h
#pragma once

#include "Test.h"

#ifdef	_DEBUG
#pragma comment(lib,"TestLib_d.lib")
#else
#pragma comment(lib,"TestLib_r.lib")
#endif

コード:

//Test.h
#pragma once
class Test{
public:
	Test();
	void test();
};

コード:

//Test.cpp
#include "Test.h"
#include <iostream>
Test::Test(){
	std::cout<<"TEST";
}
void Test::test(){
	std::cout<<"test";
}
これらからライブラリを生成し、TestLibを読み込んだのですが

コード:

//Test02.cpp
#Include "TestLib.h"
#include <iostream>

int main(){
  Test t();
  t.test();
  std::cin.ignore();

  return 0;
}

こんな感じに書きました
しかし、実際に進めているライブラリでは、
error LNK2005: "public: __thiscall std::_Container_base12::~_Container_base12(void)" (??1_Container_base12@std@@QAE@XZ) は既に msvcprtd.lib(MSVCP100D.dll) で定義されています。
のエラーがはいてしまっています
ライブラリには、標準ライブラリを入れてしまってはいけないのでしょうか??

アバター
Ketty
記事: 103
登録日時: 11年前

Re: スタティックライブラリーの作成について

#5

投稿記事 by Ketty » 10年前

Bone さんが書きました: ライブラリには、標準ライブラリを入れてしまってはいけないのでしょうか??
そんなことはありませんよ(^^)
私はstlをインクルードしたLibを作って動かしてますし、
一応、私の手元でもBoneさんの貼られたソースでLibおよび参照側プロジェクトを作ってみたところ、ちゃんと動きました。

ただし、いくつか不都合があったので手直ししました。

まず、Lib側のcpp(Test.cpp)がビルドできなかったので以下を追加しました。

コード:

#include "StdAfx.h"
これがないとLibを作る際にエラーになるはずなのですが・・・
Visual Studio上で"追加⇒クラス"で追加していれば自動的に挿入されているはずなんですが。

それから、参照側(Test02.cpp)も以下の2ヶ所が原因でビルドできませんでした。

コード:

#Include "TestLib.h"

コード:

Test t();
たぶん、ここに書き込むにあたって、ちょこちょこいじって・・・間違えられたんですよね(??)
いろんな方から正しい回答をもらうためにも、ご自身のソースは、なるべくありのまま正しく貼らるのがよいです。

↓私はこのように直しました。

コード:

//Test02.cpp
#include "TestLib.h"
#include <iostream>
 
int main(){
  Test t;
  t.test();
  std::cin.ignore();
 
  return 0;
}

Bone
記事: 7
登録日時: 11年前

Re: スタティックライブラリーの作成について

#6

投稿記事 by Bone » 10年前

回答ありがとうございます
stdafx.hですが、作成したさいに、プリコンパイル済みを切らずに作った場合出てきました
そもそも、これがどういう働きかわからないです・・・

わかりづらくて申し訳ないのですが、前回時点でTestLibのほうはコンパイルに成功し、使えました。
しかし、なぜかコンストラクタにかかれている処理は実行されませんでした。

開発中のライブラリで、競合のエラー等が発生してしまいました

使用していたライブラリは、string、iostream、cstdarg
です

コードはまた別途送ります
申し訳ないです

アバター
Ketty
記事: 103
登録日時: 11年前

Re: スタティックライブラリーの作成について

#7

投稿記事 by Ketty » 10年前

なるほど、プリコンパイル済みヘッダーにしなかったのですね。
私は特に何も考えずにその設定をONで作ってました。

stdafxについては、以下が分かりやすかったです(^^)
http://www.geocities.co.jp/Hollywood/2358/mfc_7.html

それから、私のプロジェクト設定で、
もしかしたら…と思われる設定があったのでお伝えしておきます。
Boneさんのやつを動かしたときに、私は以下の(キャプチャの)設定を
Lib側にも参照側にもやってました。
添付ファイル
capture.png

Bone
記事: 7
登録日時: 11年前

Re: スタティックライブラリーの作成について

#8

投稿記事 by Bone » 10年前

Kettyさんありがとうございます!
なんとか、コンパイル等できるようになりました!
どうやらKettyさんの言っていた、ランタイムライブラリの設定がだめだったようです・・・!
本当にありがとうございました!!

閉鎖

“C言語何でも質問掲示板” へ戻る