ページ 11

[C++]弱い外部リンケージ、とはなんでしょうか?

Posted: 2017年9月27日(水) 02:30
by Tepp
お世話になっております。

環境:Windows 10、Visual Studio 2015

C++でoperator newをオーバーライドしたところ、
LNK2005 "void * __cdecl operator new(unsigned __int64)" (??2@YAPEAX_K@Z) は既に MSVCRTD.lib(new_scalar.obj) で定義されています。
というエラーにぶつかりました。

https://support.microsoft.com/ja-jp/hel ... s-are-link
ではMFCが例ですが、operator newは弱い外部リンケージを使用しているため、
CRTライブラリより先にリンクすることで解決しそうです。

そこで疑問ですが、この「弱い外部リンケージ」とは具体的にどういう意味なのでしょうか?
先に他がリンクしていれば、リンクしようとしない、ということでしょうか?
ではそういう場合、自分でこの「弱い外部リンケージ」を実現するにはどういった設定をすれば可能でしょうか?

よろしくお願いいたします。

Re: [C++]弱い外部リンケージ、とはなんでしょうか?

Posted: 2017年9月27日(水) 05:20
by へにっくす
以下が参考になるかも(英語ですが、ソースを見れば何となく解かる?)

Weak linkage in C programming

VC++に__weakというキーワードがあるかは分かりませんが…

Re: [C++]弱い外部リンケージ、とはなんでしょうか?

Posted: 2017年9月27日(水) 23:43
by Tepp
情報ありがとうございます。

「弱い外部リンケージ」だとあまりヒットしませんでしたが、Weak Symbolがキーワードのようですね。
https://stackoverflow.com/questions/229 ... 7#11529277

__declspec(selectany)や#pragma comment(linker, "/alternatename:xxx=yyy")
というのが上がっていますが、試してみたけど、関数には使えないようですし。

https://ofekshilon.com/2014/02/10/linker-weak-symbols/

ひとまず表題の件はこれで把握できたので、解決済とします。
ありがとうございました。