Compiling multiple targets on Windows

I’ve just picked up 14.6 and have been fighting with it all day for one reason or another. I’ve resolved my issues such that I’m able to compile but with a caveat. (targeting 64-bit Windows)

I can submit source code over e-mail if desired.

Your release notes state (pgirn146.pdf):
“C++ programs on Win64 that are compiled with the option –tp x64 fail when using PGI Unified Binaries. The –tp x64 switch is not yet supported on the Windows platform for C++.”

I have test code I can compile and execute with both situations taken from one of your helpfile examples:
#include<windows.h>

int main() {
#pragma global novector
float a[100][100], b[100][100],c[100][100];
int time, maxtime, n, i, j;
maxtime=10;
n=100;
for (time=0; time<maxtime;time++)
for (j=0; j<n;j++)
for (i=0; i<n;i++)
c_[j] = a[j] + b[j];
};

C:\Temp>pgcpp test.cpp -tp k8-64,k8-64e,sandybridge-64
C:\Temp>pgcpp test.cpp -tp x64

However, I have real code that fails to build a unified binary with either form of the expression but will succeed with just a single target. The two command lines issuing errors are as follows and the linker errors (multiply defined symbols) are pasted following.

“C:\Program Files\PGI\win64\14.6\bin\pgcpp.exe” “c:\analysis\surfaceextraction2\dim[3Dv] nv[1v] or[iso] parS[omp] out[incr] bool[bool] pvar[cref] nums[64] str[SoA] opt[O1] compiler[PG] preprocessor[ILI] typ[arr] id[thread]\SurfaceExtraction2.cpp” -o “c:\analysis\surfaceextraction2\SurfaceExtraction2__dim[3Dv] nv[1v] or[iso] parS[omp] out[incr] bool[bool] pvar[cref] nums[64] str[SoA] opt[O1] compiler[PG] preprocessor[ILI] typ[arr] id[thread].exe” -D “PGI” --no_exceptions -silent -w --no_exceptions -mp -D “AUTOCONFIG” -m64 -O1 -tp k8-64,k8-64e,sandybridge-64


“C:\Program Files\PGI\win64\14.6\bin\pgcpp.exe” “c:\analysis\surfaceextraction2\dim[3Dv] nv[1v] or[iso] parS[omp] out[incr] bool[bool] pvar[cref] nums[64] str[SoA] opt[O1] compiler[PG] preprocessor[ILI] typ[arr] id[thread]\SurfaceExtraction2.cpp” -o “c:\analysis\surfaceextraction2\SurfaceExtraction2__dim[3Dv] nv[1v] or[iso] parS[omp] out[incr] bool[bool] pvar[cref] nums[64] str[SoA] opt[O1] compiler[PG] preprocessor[ILI] typ[arr] id[thread].exe” -D “PGI” --no_exceptions -silent -w --no_exceptions -mp -D “AUTOCONFIG” -m64 -O1 -tp x64


libstdmp.lib(time_facets.obj) : error LNK2005: allocate__Q2_3std37__node_alloc__
tm__17_XCbL_1_1XCiL_1_0SFUL_Pv already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(time_facets.obj) : error LNK2005: deallocate__Q2_3std37__node_alloc
__tm__17_XCbL_1_1XCiL_1_0SFPvUL_v already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(time_facets.obj) : error LNK2005: copy_trivial__3stdFPCvT1Pv alre
ady defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(time_facets.obj) : error LNK2005: max__tm__3_UL__3stdFRCZ1ZT1_RCZ1Z
already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(locale_impl.obj) : error LNK2005: allocate__Q2_3std37__node_alloc

tm__17_XCbL_1_1XCiL_1_0SFUL_Pv already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(locale_impl.obj) : error LNK2005: deallocate__Q2_3std37__node_alloc
__tm__17_XCbL_1_1XCiL_1_0SFPvUL_v already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(locale_impl.obj) : error LNK2005: _copy_trivial__3stdFPCvT1Pv alre
ady defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(locale_impl.obj) : error LNK2005: max__tm__3_UL__3stdFRCZ1ZT1_RCZ1Z
already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(dll_main.obj) : error LNK2005: allocate__Q2_3std37__node_alloc__tm

_17_XCbL_1_1XCiL_1_0SFUL_Pv already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(dll_main.obj) : error LNK2005: deallocate__Q2_3std37__node_alloc__t
m__17_XCbL_1_1XCiL_1_0SFPvUL_v already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(dll_main.obj) : error LNK2005: copy_trivial__3stdFPCvT1Pv already
defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(dll_main.obj) : error LNK2005: max__tm__3_UL__3stdFRCZ1ZT1_RCZ1Z al
ready defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(num_get.obj) : error LNK2005: allocate__Q2_3std37__node_alloc__tm

17_XCbL_1_1XCiL_1_0SFUL_Pv already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(num_get.obj) : error LNK2005: deallocate__Q2_3std37__node_alloc__tm
__17_XCbL_1_1XCiL_1_0SFPvUL_v already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(num_get.obj) : error LNK2005: copy_trivial__3stdFPCvT1Pv already
defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(num_get.obj) : error LNK2005: max__tm__3_UL__3stdFRCZ1ZT1_RCZ1Z alr
eady defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(num_put.obj) : error LNK2005: allocate__Q2_3std37__node_alloc__tm

17_XCbL_1_1XCiL_1_0SFUL_Pv already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(num_put.obj) : error LNK2005: deallocate__Q2_3std37__node_alloc__tm
__17_XCbL_1_1XCiL_1_0SFPvUL_v already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(num_put.obj) : error LNK2005: __copy_trivial__3stdFPCvT1Pv already
defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(num_put.obj) : error LNK2005: max__tm__3_UL__3stdFRCZ1ZT1_RCZ1Z alr
eady defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(ctype.obj) : error LNK2005: _copy_trivial__3stdFPCvT1Pv already de
fined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(monetary.obj) : error LNK2005: allocate__Q2_3std37__node_alloc__tm

_17_XCbL_1_1XCiL_1_0SFUL_Pv already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(monetary.obj) : error LNK2005: deallocate__Q2_3std37__node_alloc__t
m__17_XCbL_1_1XCiL_1_0SFPvUL_v already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(monetary.obj) : error LNK2005: _copy_trivial__3stdFPCvT1Pv already
defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(monetary.obj) : error LNK2005: max__tm__3_UL__3stdFRCZ1ZT1_RCZ1Z al
ready defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(messages.obj) : error LNK2005: allocate__Q2_3std37__node_alloc__tm

_17_XCbL_1_1XCiL_1_0SFUL_Pv already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(messages.obj) : error LNK2005: deallocate__Q2_3std37__node_alloc__t
m__17_XCbL_1_1XCiL_1_0SFPvUL_v already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(messages.obj) : error LNK2005: copy_trivial__3stdFPCvT1Pv already
defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(collate.obj) : error LNK2005: allocate__Q2_3std37__node_alloc__tm

17_XCbL_1_1XCiL_1_0SFUL_Pv already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(collate.obj) : error LNK2005: deallocate__Q2_3std37__node_alloc__tm
__17_XCbL_1_1XCiL_1_0SFPvUL_v already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(collate.obj) : error LNK2005: _copy_trivial__3stdFPCvT1Pv already
defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(numpunct.obj) : error LNK2005: allocate__Q2_3std37__node_alloc__tm

_17_XCbL_1_1XCiL_1_0SFUL_Pv already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(numpunct.obj) : error LNK2005: deallocate__Q2_3std37__node_alloc__t
m__17_XCbL_1_1XCiL_1_0SFPvUL_v already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(numpunct.obj) : error LNK2005: __copy_trivial__3stdFPCvT1Pv already
defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(num_get_float.obj) : error LNK2005: min__tm__2_i__3stdFRCZ1ZT1_RCZ1
Z already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(num_put_float.obj) : error LNK2005: allocate__Q2_3std37__node_alloc
__tm__17_XCbL_1_1XCiL_1_0SFUL_Pv already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(num_put_float.obj) : error LNK2005: deallocate__Q2_3std37__node_all
oc__tm__17_XCbL_1_1XCiL_1_0SFPvUL_v already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(num_put_float.obj) : error LNK2005: _copy_trivial__3stdFPCvT1Pv al
ready defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(num_put_float.obj) : error LNK2005: min__tm__2_i__3stdFRCZ1ZT1_RCZ1
Z already defined in pgcpp5dwuibcUGMUjsQ.obj
libstdmp.lib(num_put_float.obj) : error LNK2005: max__tm__3_UL__3stdFRCZ1ZT1_RCZ
1Z already defined in pgcpp5dwuibcUGMUjsQ.obj
C:\Users\sgodfrey\AppData\Local\Temp/pgcpp6eguibsEMDfsdd.exe : fatal error LNK11
69: one or more multiply defined symbols found

The release notes are a bit unclear on this subject. They should have read:

Unified binaries are not supported on Windows for C++ programs.

There are limitations in the object file format that prevent this support.

Got it, thanks Deb!
Any chance you guys might put a little message in there for the user when they’re trying to do this? It’s a real head scratcher and the relevant information is pretty scattered in those help files… this seems like it’s less of a release notes kind of issue and more of regular old feature documentation.