2017-10-31 22 views
3

長年私はmain()を定義している点で特別な特徴を持つライブラリ 'wot I wrote'を使用してきました。VS2017とVS2015のリンカーに違いはありますか?

これは、私が書いたアプリケーションには、mainが必要なわけではないことを意味しています。リンカにはすでに未解決の参照があり、それを探して自分のライブラリ内で見つけます。

このテクニックは、VS2005/2008/2015を含むいくつかのプラットフォームで動作しています。今私はVS2017をインストールし、VS2015で構築されたライブラリを参照する新しいプロジェクトを開始しました。

新しいプロジェクトがこれだけのように一つのソースファイルがあります。

// necessary #includes elided 
namespace gp { 
    void Options(Run& runner) { 
     runner << "test2017"; 
    } 
} 

私の期待は、このファイルをコンパイルし、私のライブラリとリンク(インスタンスのタイプRunが宣言され、そこに定義されている)ということです。

リンカはその後、文句:

LINK : fatal error LNK1561: entry point must be defined 

をしかし、単純に一つのソースファイルに以下の行を追加:

int main(int, char*[]); 
auto p = &main; 

プログラムのリンクと実行され、私が予想される出力を得る:

**** test2017 **** 
+0

なぜ、あなたのメインのextern「C」はありますか? –

+0

元気です。 'extern" C "'は無関係です。私は質問からそれを削除します。私はリンカを動作させようとしている間にそれを入れましたが、チェックするためにリンカを削除したことはありませんでした。ありがとう。 – quamrana

+0

2017でライブラリを再コンパイルすると何か変更されますか? –

答えて

2

/SUBSYSTEM:CONSOLEをリンカーに指定してください。おそらくmainの代わりにWinMainが検索されるからです。

あなたはリンカ/システム/サブシステムでこれを設定して Console (/SUBSYSTEM:CONSOLE)を選択します(代わりに Windows (/SUBSYSTEM:WINDOWS)の)ことができ、プロジェクトのプロパティページで

+0

根本原因は新しい空プロジェクトを作成したためです。私は新しいWindowsコンソールアプリケーションを作成すべきだったと思う。 – quamrana

関連する問題